BUILTIN 지시문

BUILTIN 지시문 (BUILTIN directive)

미들엔드 내장(middle-end built-in)의 벡터 구현을 정의하는 !GCC$ BUILTIN 지시문을 소개해요. 주로 GCC 컴파일러와 GNU C 라이브러리 사이의 API를 제공하는 데 쓰여요.

출처: BUILTIN directive

본문

지시문의 문법은 이래요.

!GCC$ BUILTIN ( B ) attributes simd FLAGS IF('target')

이 지시문으로 어떤 미들엔드 내장이 벡터 구현을 제공하는지 정의할 수 있어요. 여기서 B는 미들엔드 내장의 이름이에요. FLAGS는 선택사항이며 (inbranch) 또는 (notinbranch) 중 하나여야 해요. IF 문도 선택사항인데, 벡터화해야 할 내장에 대해 multilib ABI를 걸러내는 데 쓰여요.

사용 예시를 볼게요.

!GCC$ builtin (sinf) attributes simd (notinbranch) if('x86_64')

특수 타깃 'fastmath'는 벡터 구현이 fast-math가 켜져 있을 때만 유효함을 지정하는 데 쓰여요.

!GCC$ builtin (exp) attributes simd (notinbranch) if('fastmath')

이 지시문의 목적은 GCC 컴파일러와 GNU C 라이브러리 사이에서 수학 루틴의 벡터 구현을 정의하는 API를 제공하는 것이에요. 즉 컴파일러가 알려진 수학 함수(sinf, exp 등)를 벡터화할 때, 어떤 타깃·조건에서 어느 벡터 구현을 사용할지 이 지시문이 연결고리를 만들어 주는 거예요.

if('fastmath')가 의미하는 바를 다시 짚을게요. fast-math가 꺼진 상태에서는 해당 벡터 구현이 유효하지 않다고 판단해 벡터화를 하지 않고, 켜진 상태에서만 그 벡터 구현을 허용해요. 그래서 정밀도·IEEE 준수에 민감한 기본 모드에서는 안전한(스칼라) 경로를 유지할 수 있어요.

또 하나 눈여겨볼 점은 attributes simd 부분이에요. 이 속성은 벡터 구현이라는 뜻을 담고 있고, (inbranch)/(notinbranch)는 그 벡터 구현이 분기(branch) 안에서 호출되는 경우에만 쓸지, 아니면 그 반대 상황에서만 쓸지를 세밀하게 다듬는 플래그예요. 어떤 경우에 벡터화를 허용할지 컴파일러와 라이브러리 양쪽이 같은 규칙을 공유해야 하니, IF('target')로 타깃을 걸러내는 것까지 포함해 하나의 계약처럼 맞춰 쓰는 거예요.

더 알아보기

  • GNU Fortran 컴파일러 지시문
  • 벡터화와 SIMD 속성
  • fast-math 최적화 옵션