gcc가 함수를 인라인하도록 어떻게 강제합니까?
__attribute__((always_inline))
함수가 gcc에 의해 인라인되도록 강제 합니까 ?
예.
에서 문서
always_inline
일반적으로 최적화가 지정되지 않는 한 함수는 인라인되지 않습니다. 인라인으로 선언 된 함수의 경우이 속성은 최적화 수준이 지정되지 않은 경우에도 함수를 인라인합니다.
그래야한다. 저는 수동 인라이닝의 열렬한 팬입니다. 물론, 과도하게 사용하면 나쁜 일입니다. 그러나 종종 코드를 최적화 할 때 단순히 인라인되어야하거나 성능이 저하되는 기능이 하나 또는 두 개있을 것입니다. 그리고 솔직히 내 경험상 C 컴파일러는 일반적으로 inline 키워드를 사용할 때 이러한 함수를 인라인 하지 않습니다 .
저는 컴파일러가 저를 위해 대부분의 코드를 인라인하도록 할 의향이 있습니다. 제가 정말 신경 쓰는 것은 6 개 정도의 절대적으로 중요한 케이스들입니다. 사람들은 "컴파일러들이이 일을 잘한다"고 말합니다. 그 증거를보고 싶습니다. 지금까지 강제 인라인 구문 ( gcc의 msvc 에서) 을 사용하지 않고 내가 말한 중요한 코드를 C 컴파일러가 인라인하는 것을 본 적이 없습니다 .__forceinline
__attribute__((always_inline))
예, 그럴 것입니다. 그렇다고 좋은 생각이라는 뜻은 아닙니다.
gcc 최적화 옵션 문서 에 따르면 매개 변수를 사용하여 인라인을 조정할 수 있습니다.
-finline-limit=n
By default, GCC limits the size of functions that can be inlined. This flag
allows coarse control of this limit. n is the size of functions that can be
inlined in number of pseudo instructions.
Inlining is actually controlled by a number of parameters, which may be specified
individually by using --param name=value. The -finline-limit=n option sets some
of these parameters as follows:
max-inline-insns-single is set to n/2.
max-inline-insns-auto is set to n/2.
인라인을위한 모든 매개 변수에 대해 자세히 읽어보고 적절하게 설정하는 것이 좋습니다.
예. 다른 옵션 세트에 관계없이 함수를 인라인합니다. 를 참조하십시오 여기 .
여기에 인라인이 성능에 절대적으로 중요한 SIMD 수학 라이브러리가 있다고 추가하고 싶습니다. 처음에는 모든 함수를 인라인으로 설정했지만 디스 어셈블리는 가장 사소한 연산자라도 실제로 함수를 호출하기로 결정한다는 것을 보여주었습니다. MSVC와 Clang 모두 모든 최적화 플래그가 켜져있는 상태에서이를 보여주었습니다.
나는 SO의 다른 게시물에서 제안한대로 __forceinline
MSVC 및 __attribute__((always_inline))
다른 모든 컴파일러에 대해 추가 했습니다 . 기본 곱셈에서 사인에 이르기까지 다양한 작업을 통해 다양한 타이트 루프에서 성능이 지속적으로 25-35 % 향상되었습니다.
인라이닝이 왜 그렇게 어려운지 이해하지 못했지만 (아마도 템플릿 코드가 더 어려울까요?) 결론은 다음과 같습니다. 수동으로 인라이닝하는 데 매우 유효한 사용 사례와 엄청난 속도 향상을 얻을 수 있습니다.
궁금하다면 이것이 내가 구현 한 곳입니다. https://github.com/redorav/hlslpp
하나도 사용할 수 있습니다 __always_inline
. GCC 4.8.1의 C ++ 멤버 함수에 사용했습니다. 그러나 GCC 문서에서 좋은 설명을 찾을 수 없습니다.
사실 대답은 "아니오"입니다. 즉, 최적화가 비활성화 된 상태에서도 함수가 인라인 후보라는 것입니다.
참조 URL : https://stackoverflow.com/questions/8381293/how-do-i-force-gcc-to-inline-a-function
'programing' 카테고리의 다른 글
JavaScript 파일 또는 REPL에서 CoffeeScript 파일을 require () 'ing (0) | 2021.01.19 |
---|---|
검사 스타일 : "숨겨진 필드"오류 해결 방법 (0) | 2021.01.19 |
stdout과 stderr을 쉘 스크립트의 두 가지 다른 프로세스로 파이프합니까? (0) | 2021.01.19 |
epoll의 에지 트리거 옵션의 목적은 무엇입니까? (0) | 2021.01.19 |
Jenkins는 어떤 셸을 사용합니까? (0) | 2021.01.19 |