컴파일러

위의 루프를 SIMD 명령으로 벡터화하기 어려운 주된 이유는?

for (i = 1; i < n; i++)
    a[i] = a[i - 1] + b[i];
  1. A직전 반복의 결과 a[i-1]이 필요해 동시에 계산할 수 없기 때문에
  2. B배열 요소의 타입이 정수이므로 SIMD 명령으로는 계산할 수 없기 때문에
  3. C루프 횟수 n을 컴파일 시에 알 수 없으면 벡터화가 전혀 불가능하기 때문에
정답과 해설 보기

정답: A. 직전 반복의 결과 a[i-1]이 필요해 동시에 계산할 수 없기 때문에

벡터화에서는 예를 들어 4개 요소의 계산을 하나의 SIMD 명령으로 동시에 수행합니다. 이 루프에서는 a[i]를 구하는 데 바로 앞의 a[i-1] 결과가 필요하므로 a[1]~a[4]를 동시에 계산할 수 없습니다. 이처럼 반복에 걸친 의존(루프 전달 의존)이 있으면 그대로는 벡터화할 수 없습니다. 정수도 SIMD로 계산할 수 있고, 횟수가 실행 시에 정해지는 경우에도 나머지 부분을 따로 처리하여 벡터화할 수 있습니다.

  • A. 올바릅니다. 직전 결과에 의존하므로 동시에 계산할 수 없습니다.
  • B. 정수 계산도 SIMD 명령으로 수행할 수 있습니다.
  • C. 횟수가 실행 시에 정해져도 나머지를 따로 처리하면 벡터화할 수 있습니다.
이 분야 연습하기 분야로 돌아가기

컴파일러의 다른 문제

  1. 위의 함수에서 컴파일러가 *b의 읽기를 루프 밖으로 내보내는 최적화를 그대로는 수행할 수 없는 이유는?
  2. 컴파일러의 레지스터 할당에서 간섭 그래프를 색칠하는(채색하는) 방법을 사용할 때, 그래프의 노드와 간선이 나타내는 것의 조합으로 올바른 것은?
  3. 레지스터 할당에서 「스필」이 일어나면 생성되는 코드는 어떻게 되는가?
  4. 컴파일러의 명령 스케줄링의 주된 목적은?
  5. 위의 함수의 마지막 재귀 호출에 꼬리 호출 최적화를 적용하면 어떤 효과가 있는가?

이 분야의 비교