`IVDEP` 지시문

IVDEP 지시문

컴파일러가 루프를 벡터화해도 안전하다고 알려주는 GNU Fortran의 지시문이에요. 컴파일러가 반복 간 의존성을 의심해 벡터화를 망설일 때, 이 지시문으로 "의존성은 신경 쓰지 않아도 된다"고 알려주면 더 적극적으로 벡터화를 시도할 수 있어요.

출처: IVDEP directive (The GNU Fortran Compiler)

본문

지시문의 문법은 다음과 같아요:

!GCC$ ivdep

이 지시문은 컴파일러에게 다음 루프에서 벡터 의존성(vector dependency)을 무시하라고 알려요. 반드시 DO 루프 바로 앞에 놓여야 하며, 바로 뒤에 오는 루프 하나에만 적용돼요.

컴파일러가 특정 루프가 벡터화 가능한지 판단할 때 반복 간 잠재적 의존성 때문에 충분한 정보가 없어 망설이는 경우가 있어요. 이 지시문의 목적은 그런 상황에서 "벡터화가 안전하다"고 컴파일러에게 알려주는 거예요.

DO CONCURRENT 구문의 경우, 이 표시는 모든 루프 제어 변수에 암묵적으로 적용돼요.

이 지시문은 기존 코드에 표시를 붙이는 용도로 설계됐어요. 새 코드를 작성한다면 OpenMP SIMD 지시문을 잠재적 대안으로 고려하는 걸 권장해요.

더 알아보기

  • !GCC$ ivdep는 루프 바로 앞에, 적용 대상 루프 하나에만 효과가 있어요.
  • 반복 간 의존성이 실제로 없는데 컴파일러가 보수적으로 행동할 때 벡터화 성능을 끌어올리는 데 유용해요.
  • 다만 의존성이 실제로 있다면 결과가 달라질 수 있으므로 잘못 붙이지 않도록 주의해야 해요.
  • 새 코드라면 표준적인 OpenMP SIMD 지시문이 더 나은 선택일 수 있어요.
  • DO CONCURRENT에서는 모든 루프 제어 변수에 이 표시가 암묵적으로 적용되므로 별도로 붙이지 않아도 돼요.
  • 이 지시문은 "컴파일러에게 안전하다는 확신을 주는" 힌트일 뿐 강제가 아니에요. 최적화 수준과 대상 아키텍처에 따라 컴파일러가 여전히 벡터화하지 않을 수도 있어요.