2014-03-06 4 views
4

"전체 프로그램 최적화"(wpo)와 "링크 타임 코드 생성"(ltcg)에 대해 읽었습니다.모든 소스 파일을 한 번에 컴파일러에 전달하면 어떤 이점이 있습니까?

cli (예 : "g ++ a.cpp b.cpp")의 컴파일러에 모든 소스를 한꺼번에 전달하면 더 많은 모듈 간 분석이 진행되는 것이 궁금합니다. 아니면이 플래그 중 하나만 활성화 할 예정입니까?

컴파일러간에 차이점이 있습니까? 예를 들어 intel 컴파일러는 다른 컴파일러가 사용하지 않는 동안 그러한 연습을 할 수 있습니까? 내가 ("g ++ a.cpp의 b.cpp"와 같은) CLI에서 컴파일러에 한 번에 모든 소스를 통과 궁금

+0

모든 최적화와 마찬가지로 이것은 강력하게 컴파일러 (버전)에 따라 다릅니다. –

답변

5

이 모듈 간 분석은 계속 더?

GCC의 경우 WPO를 사용할 수 없으므로 각 번역 단위가 별도로 처리됩니다. 나는 Clang에 대해 99 %가 동일하고 90 %가 다른 컴파일러에 대해서도 사실임을 확신합니다.

GCC를 사용하면 모듈 간 최적화를 사용하려면 각 번역 단위를 격리 된 상태로 처리하는 -flto 스위치를 통해 명시 적으로 요청해야하지만 추가 정보가 개체 파일에 기록 된 다음 추가로 연결될 때 최적화 출력이 최종 출력을 생성하기 위해 수행됩니다.

+0

알리 예, 고쳤습니다. 감사합니다. –

+0

예. 댓글을 +1하고 삭제할 수 있습니다. – Ali

2

적어도 GCC의 경우 올바른 컴파일러 플래그를 제공하면 yes입니다.

컴파일러는 프로그램에 대한 지식을 기반으로 최적화를 수행합니다. -funit-at-a-time 플래그를 사용하면 컴파일러가 함수를 컴파일 할 때 파일의 나중 함수에서 얻은 정보를 고려할 수 있습니다. 여러 파일을 한 번에 단일 출력 파일로 컴파일하면 (-funit-at-a-time 사용) 컴파일러는을 컴파일 할 때 모든 파일에서 얻은 정보를 사용할 수 있습니다.

출처 : GCC optimization options

비록 모두가 개별적으로 제기 및 LTO를 활성화하면 conceputally 매우 유사한 (또는 동일) 결과를 제공한다 컴파일.

+1

이 옵션은 현재 사용되지 않습니다 - 여러분이 제공 한 문서에 대한 링크는 gcc 3.4이고 현재 gcc는 4.8 또는 4.9 - 약간은 10 년입니다. – onqtam

+0

흠, 여전히'gcc-6.1.0' [documentation] (https://gcc.gnu.org/onlinedocs/gcc-6.1.0/gcc/Optimize-Options.html) ...이 정보가 오래되어서는 안 될까요? – NHDaly

2

Intel C++ 컴파일러 (ICC)는 이것을 프로 시저 간 프로시 듀 n 최적화로 지원합니다. Jonathan이 말했듯이 각 소스 파일은 IPO로 컴파일되어 모의 객체 파일에 저장됩니다. 모의 객체 파일을 연결하려면 인텔 연결 도구를 사용해야합니다. 연결 단계에서 컴파일러는 모든 모의 객체 파일에 대해 프로 시저 간 최적화를 수행하기 위해 마지막으로 한 번 (IPO로 빌드 할 때) 호출됩니다. 자세한 내용은 https://software.intel.com/en-us/node/459446에 설명되어 있습니다.

+0

링크가 구식입니다. 다음은 새로운 링크입니다. [link] (https://software.intel.com/node/522667) – andreee