-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.