컴파일러
위의 루프를 SIMD 명령으로 벡터화하기 어려운 주된 이유는?
for (i = 1; i < n; i++)
a[i] = a[i - 1] + b[i];
- A직전 반복의 결과 a[i-1]이 필요해 동시에 계산할 수 없기 때문에
- B배열 요소의 타입이 정수이므로 SIMD 명령으로는 계산할 수 없기 때문에
- C루프 횟수 n을 컴파일 시에 알 수 없으면 벡터화가 전혀 불가능하기 때문에
정답과 해설 보기
정답: A. 직전 반복의 결과 a[i-1]이 필요해 동시에 계산할 수 없기 때문에
벡터화에서는 예를 들어 4개 요소의 계산을 하나의 SIMD 명령으로 동시에 수행합니다. 이 루프에서는 a[i]를 구하는 데 바로 앞의 a[i-1] 결과가 필요하므로 a[1]~a[4]를 동시에 계산할 수 없습니다. 이처럼 반복에 걸친 의존(루프 전달 의존)이 있으면 그대로는 벡터화할 수 없습니다. 정수도 SIMD로 계산할 수 있고, 횟수가 실행 시에 정해지는 경우에도 나머지 부분을 따로 처리하여 벡터화할 수 있습니다.
- A. 올바릅니다. 직전 결과에 의존하므로 동시에 계산할 수 없습니다.
- B. 정수 계산도 SIMD 명령으로 수행할 수 있습니다.
- C. 횟수가 실행 시에 정해져도 나머지를 따로 처리하면 벡터화할 수 있습니다.