NOVECTOR 지시문
NOVECTOR 지시문 (NOVECTOR directive)
컴파일러가 자동으로 루프를 벡터화하는데, 특정 루프만 그렇게 하지 않길 원할 때가 있어요. 성능 프로파일링으로 원인을 찾아 수동으로 막고 싶을 때 유용한 지시문이에요.
본문
지시문의 문법은 다음과 같아요.
!GCC$ novector
이 지시문은 컴파일러에게 "다음에 오는 루프는 벡터화하지 말라"고 알려 줘요. 반드시 DO 루프 바로 앞에 놓아야 하며, 바로 뒤에 따라오는 그 루프에만 적용돼요. 즉 지시문과 루프 사이에 다른 문장이 끼어들면 안 돼요.
DO CONCURRENT 구조에서는 이 주석이 동시 실행 헤더(concurrent header)에 지정된 모든 루프에 적용돼요. 일반 DO 루프 하나만 다루는 경우와 달리, 컨커런트 구조는 헤더에 여러 루프가 함께 선언되기 때문에 지시문 하나가 그 전체를 대상으로 삼는 거예요.
벡터화는 대개 성능을 높여 주지만, 항상 유리한 것만은 아니에요. 어떤 경우에는 실행 순서에 민감한 계산이나 데이터 의존성이 있는 루프에서 벡터화가 오히려 잘못된 결과를 만들 위험을 키우기도 해요. 그럴 때 이 지시문으로 개별 루프의 벡터화만 끄고 나머지 최적화는 그대로 유지할 수 있어요.
사용 위치가 중요해요. 지시문은 DO 루프 바로 앞에, 그리고 해당 루프에만 영향을 주도록 둬야 해요. 루프 앞에서 다른 주석이나 문장이 끼어들면 적용 대상이 어긋날 수 있어요. 반대 방향으로 특정 루프를 벡터화하도록 강제하고 싶다면 VECTOR 지시문을 참고하세요.
설명을 한 번 더 정리하면, 벡터화를 원하지 않는 개별 루프 앞에 !GCC$ novector를 놓는 것이 전부예요. 지시문이 적용되는 범위가 "바로 뒤 루프"로 한정된다는 점, 그리고 DO CONCURRENT에서는 헤더 전체에 적용된다는 점만 기억하면 실수할 일이 없어요.
더 알아보기
VECTOR지시문 (반대 역할)- GNU Fortran 컴파일러 지시문 전체 목록
- 자동 벡터화와 관련된 컴파일 옵션