`VECTOR` 지시어
VECTOR 지시어
성능에 민감한 루프를 작성할 때, 컴파일러가 그 루프를 벡터화(vectorize)해 주길 원하는 경우가 있어요. 자동 벡터화를 놓치고 있다면 개발자가 직접 힌트를 줄 수도 있는데, 그때 쓰는 지시어가 VECTOR예요. 문법과 적용 범위를 함께 볼게요.
출처: VECTOR directive
본문
VECTOR 지시어의 문법은 다음과 같아요.
!GCC$ vector
이 지시어는 컴파일러에게 뒤따르는 루프를 벡터화하라고 알려 줘요. 지시어는 반드시 DO 루프 바로 앞에 놓여야 하고, 바로 뒤에 오는 루프에만 적용돼요.
DO CONCURRENT 구문의 경우에는 이 주석이 동시성 헤더(concurrent header)에 지정된 모든 루프에 적용돼요. 앞서 본 UNROLL 지시어가 DO CONCURRENT에서 첫 번째 루프 변수에만 적용된 것과는 대조적이에요. 즉 VECTOR는 DO CONCURRENT에선 더 넓게 작용해요.
벡터화는 SIMD 명령을 활용해 여러 데이터를 한 번에 처리하는 최적화예요. 컴파일러는 데이터 의존성이 없다고 판단되는 경우에만 안전하게 벡터화하는데, 때로는 판단을 못 해서 기회를 놓치기도 해요. 그럴 때 !GCC$ vector로 명시적인 의사를 전달해 주면 컴파일러가 그 루프를 벡터화 후보로 삼게 돼요.
이런 지시어는 단순 데이터 병렬 루프, 예를 들어 배열 요소를 같은 방식으로 변환하는 루프에서 특히 의미가 있어요. 벡터화가 가능한 형태인데 컴파일러가 의존성 분석을 보수적으로 해석해 놓친 경우, 이 지시어 하나로 성능이 크게 달라질 수 있어요.
반대로 벡터화가 오히려 성능을 해치는 경우도 있어요. 그럴 때는 반대 개념인 NOVECTOR 지시어로 막을 수 있어요. 둘 다 루프 바로 앞에 두고, 적용 대상을 명확히 해서 쓰는 것이 핵심이에요.
더 알아보기
VECTOR와 함께 쓰이는NOVECTOR지시어는 벡터화를 막아 주는 반대 역할을 해요.- 같은
!GCC$지시어 계열로UNROLL,IVDEP도 있어요. - 벡터화 결과는 CPU 아키텍처에 따라 달라지니, 실제 성능은 프로파일링으로 확인해 보는 것이 좋아요.