-O3 최적화로 GNU / Linux 컴파일


18

-O3gcc 최적화 옵션 을 사용하여 GNU 도구와 Linux 커널을 컴파일 하면 이상하고 펑키 한 버그가 발생 한다고합니다 . 사실인가요? 아무도 그것을 시도 했습니까 아니면 그냥 사기입니까?


또한 흥미롭게 -O0도 전혀 지원되지 않습니다! stackoverflow.com/questions/29151235/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

답변:


8

젠투에서 사용되었으며 이상한 점은 발견되지 않았습니다.


8
그러나 -O3은 종종 ebuild에 의해 필터링됩니다.
Maciej Piechotka

17

-O3 몇 가지 단점이 있습니다.

  1. 우선 -O2또는 보다 더 느린 코드를 생성합니다 -Os. 때로는 루프 언 롤링으로 인해 더 긴 코드를 생성하는데, 이는 코드의 캐시 성능 저하로 인해 실제로 느려질 수 있습니다.
  2. 말했듯이 때로는 잘못된 코드를 생성합니다. 최적화의 오류 또는 코드의 오류 (예 : 엄격한 앨리어싱 무시)로 인한 것일 수 있습니다. 커널 코드가 때로는 '스마트'해야하므로 일부 커널 개발자가 오류를 범했을 가능성이 있습니다. gcc 4.5로 커널을 컴파일 할 때 사용자 공간 유틸리티 충돌과 같은 다양한 이상한 문제가 발생했습니다. 커널에 gcc 4.4를 사용하고 다양한 버그로 인해 선택된 여러 사용자 공간 유틸리티를 사용합니다. 에도 동일하게 적용될 수 있습니다 -O3.
  3. 나는 그것이 리눅스 커널에 많은 이점을 제공한다고 생각하지 않습니다. 커널은 많은 계산을하지 않으며, 장소에 따라 어셈블리에 최적화되어 있습니다. -O3플래그는 컨텍스트 전환 비용이나 I / O 속도를 변경 하지 않습니다 . 전체 성능의 <0.1 % 속도 향상과 같은 것이 가치가 있다고 생각하지 않습니다.

6
리눅스는 -fno-strict-aliasing으로 컴파일되어있다. Linus는 gcc가 명백하게 다르지 않더라도 값을 다르게 취급하는 것과 같은 어리석은 일을하기 때문에 어리 석고 지나치게 제한적이라고 생각하기 때문이다. 참조). 참조 mail-archive.com/linux-btrfs@vger.kernel.org/msg01647.html
Spudd86

@ Spudd86 : 그는 인간이 코드를 읽거나 컴파일러를위한 것이 아니라는 것을 의미 했습니까? 내가 말했듯이-커널은 때때로 사용자 공간 프로그램이해서는 안되는 똑똑한 일을해야합니다. 사용자 영역에 의미가있는 (일부 영역에서는 과도한 최적화) 커널에 적합하지 않을 수 있습니다 (다른 장소에서 더 많은 스마트 코드 + 병목 현상).
Maciej Piechotka

1
그가 말한 내용은 사용자 공간에도 적용되지 않습니다.
Spudd86

1
@ Spudd86 : 그때 동의하지 않습니다. 이러한 '명백한'것들을 발견 할 수 있도록 컴파일러를 '충분히'스마트하게 만드는 것은 결코 쉬운 일이 아닙니다. 따라서 가능한 유일한 방법은 a) 느린 (더 느린) 코드 만 생성하고 (HPC와 같은 일부 유스 케이스에는 용납 할 수 없음) 프로그래머가 수동으로 코드를 최적화하도록 강요합니다. 최적화를위한 컴파일러-C 표준에 의해 수행되는 경로.
Maciej Piechotka

6

최적화 수준을 변경하면 툴체인의 큰 덩어리 (특히 glibc) 플랫 아웃이 컴파일되지 않습니다. 빌드 시스템은 대부분의 깔끔한 배포판에서 이러한 섹션에 대한 -O 기본 설정을 무시하도록 설정되어 있습니다.

간단히 말해서, 특정 기본 라이브러리 및 OS 기능은 코드가 실제로 수행하는 코드에 달려 있으며 많은 경우 더 빠를 것이 아닙니다. 특히 -fgcse-re-reload (-O3로 활성화)는 이상한 문제를 일으킬 수 있습니다.


5

지난 10 년 동안 저는 -O3 -march=native전 세계적으로 1000 개 이상의 패키지를 사용하여 여러 젠투 시스템을 운영해 왔지만 아직까지도 이러한 신화적인 안정성 문제 -O3는 발생하지 않았습니다 . 수학 / 과학 응용 프로그램과 같은 CPU 집약적 응용 프로그램의 벤치 마크는 -O3더 빠른 코드를 생성하는 것을 지속적으로 보여줍니다 . 그렇지 않으면 의미가 없습니다. 대부분의 데스크톱 응용 프로그램 CFLAGS은 IO 바인딩이기 때문에 중요하지 않지만 CPU 바인딩 된 서버 쪽 작업에는 중요합니다.


3

-O3는 레지스터 사용, 스택 프레임의 상호 작용 방식 및 함수 재진입에 대한 특정 가정이 안전하고 일부 인라인 어셈블리가 커널과 같은 일부 코드에서 이러한 가정이 사실로 보장되지 않는 경우에만 안전한 일부 공격적인 최적화를 사용합니다. 커널 및 드라이버 모듈의 매우 낮은 수준의 부분에서와 같이 사용됩니다.


항상 빠르다는 것은 말할 것도없고, 실제로 벤치마킹을하여 -O2날씨를 아는지 또는 아프거나 도움이되지 않는지 테스트해야합니다.
Spudd86

0

대부분의 응용 프로그램에서 -O3 및 기타 최적화 노브를 사용하여 벗어날 수 있지만 속도가 향상 될 수 있지만 커널 자체 또는 빌드에 필요한 도구 체인 (컴파일러, binutils, 기타.).

생각해보십시오 : 시스템 충돌 또는 잠재적 인 데이터 손실 및 / 또는 손상 가치가있는 raid 및 ext3 하위 시스템의 5 % 성능 향상입니까?

재생중인 해당 Quake 포트 또는 DVD 모음을 divx 파일로 리핑하는 데 사용하는 오디오 / 비디오 코덱에 대해 원하는 모든 노브를 조정하십시오. 당신은 아마 개선을 볼 수 있습니다. 낭비 할 시간이없고 손실 할 수있는 데이터가 없다면 커널을 망칠 필요가 없습니다.


3
가치가 있는지, 안전하지 않은지 또는 왜 우리가 이것을해서는 안되는지 묻지 않습니다. 실제로 묻는 것은 실제 응용 프로그램에서 실제로 버그를 생성합니까? 그것은 증명했다 ..
uray
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.