컴파일러
위의 루프에서 첨자 계산 i * 4에 강도 감소를 적용했을 때의 변환으로 올바른 것은?
for (i = 0; i < n; i++)
sum += a[i * 4];
- Ai * 4를 컴파일 시에 계산한 상수로 치환한다
- B루프 횟수를 4분의 1로 줄이고 본체를 4번 분량 나열한다
- C다른 변수를 준비하여 반복할 때마다 4씩 더해 간다
정답과 해설 보기
정답: C. 다른 변수를 준비하여 반복할 때마다 4씩 더해 간다
강도 감소는 무거운 연산을 가벼운 연산으로 치환하는 최적화입니다. 루프 안에서 i * 4를 매번 곱셈으로 구하는 대신, j = 0에서 시작해 반복할 때마다 j += 4로 하면 곱셈이 덧셈으로 바뀝니다. i가 바뀔 때마다 값이 달라지므로 상수로 치환할 수는 없습니다. 또한 4배 곱셈은 시프트 명령(i << 2)으로 치환할 수도 있으며, 이것도 강도 감소의 일종입니다. 본체를 4번 분량 나열하는 것은 루프 전개입니다.
- A. i와 함께 값이 바뀌므로 상수로 할 수 없습니다.
- B. 본체를 나열하는 것은 루프 전개입니다.
- C. 올바릅니다. 곱셈을 반복마다의 덧셈으로 치환합니다.