컴파일러

위의 루프에서 첨자 계산 i * 4에 강도 감소를 적용했을 때의 변환으로 올바른 것은?

for (i = 0; i < n; i++)
    sum += a[i * 4];
  1. Ai * 4를 컴파일 시에 계산한 상수로 치환한다
  2. B루프 횟수를 4분의 1로 줄이고 본체를 4번 분량 나열한다
  3. C다른 변수를 준비하여 반복할 때마다 4씩 더해 간다
정답과 해설 보기

정답: C. 다른 변수를 준비하여 반복할 때마다 4씩 더해 간다

강도 감소는 무거운 연산을 가벼운 연산으로 치환하는 최적화입니다. 루프 안에서 i * 4를 매번 곱셈으로 구하는 대신, j = 0에서 시작해 반복할 때마다 j += 4로 하면 곱셈이 덧셈으로 바뀝니다. i가 바뀔 때마다 값이 달라지므로 상수로 치환할 수는 없습니다. 또한 4배 곱셈은 시프트 명령(i << 2)으로 치환할 수도 있으며, 이것도 강도 감소의 일종입니다. 본체를 4번 분량 나열하는 것은 루프 전개입니다.

  • A. i와 함께 값이 바뀌므로 상수로 할 수 없습니다.
  • B. 본체를 나열하는 것은 루프 전개입니다.
  • C. 올바릅니다. 곱셈을 반복마다의 덧셈으로 치환합니다.
이 분야 연습하기 분야로 돌아가기

컴파일러의 다른 문제

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

이 분야의 비교