`UNROLL` 지시어
UNROLL 지시어
반복문 성능을 조정할 때, 컴파일러가 루프를 몇 번 펼쳐서(unroll) 실행할지 직접 지정하고 싶을 때가 있어요. 그럴 때 쓰는 GNU Fortran 전용 지시어가 바로 UNROLL이에요. 어떤 문법으로 어떻게 쓰는지, 그리고 어디까지 적용되는지 함께 볼게요.
출처: UNROLL directive
본문
UNROLL 지시어의 문법은 다음과 같아요.
!GCC$ unroll N
이 지시어를 사용하면 루프를 몇 번 펼칠지(언롤링 계수) 제어할 수 있어요. 루프 언롤링이 왜 유용한지 먼저 생각해 볼게요. 반복문은 매 회전마다 조건 검사와 점프 같은 오버헤드가 붙는데, 이걸 몇 회전씩 묶어서 실행하면 그 오버헤드를 줄일 수 있어요. 다만 너무 많이 펼치면 코드가 커지고 캐시에 부담이 갈 수 있으니, 적절한 계수를 정하는 게 중요해요.
지시어는 반드시 DO 루프 바로 앞에 놓여야 하고, 바로 뒤에 따라오는 루프에만 적용돼요. N은 언롤링 계수를 지정하는 정수 상수예요.
여기서 N 값이 0 또는 1이면 루프가 전혀 펼쳐지지 않도록 막아요. 다시 말해 루프 언롤링을 원하지 않을 때 0이나 1을 주면 되고, 언롤링을 원하면 2 이상을 주는 거예요. 특정 루프가 자칫 큰 코드로 펼쳐져 캐시를 압박할 때 0을 줘서 막는 식으로 활용하면 좋아요.
DO CONCURRENT 구문의 경우에는 언롤링 지정이 첫 번째 루프 제어 변수에만 적용돼요. 나머지 루프 변수에는 이 지시어의 영향이 미치지 않는다는 점을 기억해 두면 좋아요.
요약하면, 루프를 자동으로 펼치고자 하는 컴파일러의 기본 동작을 개발자가 직접 세밀하게 제어하고 싶을 때 !GCC$ unroll N을 루프 바로 앞에 두면 되는 지시어예요. 루프 하나 단위로 적용 범위가 끝나는 점과, DO CONCURRENT에서는 첫 변수에만 적용된다는 점이 핵심이에요.
더 알아보기
!GCC$지시어 계열에는IVDEP,VECTOR,NOVECTOR같은 친구들도 있어요.VECTOR지시어는 루프를 벡터화하라고 컴파일러에 지시하는 용도로, 언롤링과는 목적이 달라요.- 언롤링 계수를 직접 다루기 전에는, 먼저 컴파일러가 기본으로 생성하는 코드를 프로파일링하고 개선할 지점이 확실할 때 쓰는 것이 좋아요.