컴파일러

위의 루프에서 루프 불변식의 이동(루프 밖으로의 이동) 대상이 되는 계산은? (x, y는 루프 안에서 변경되지 않는다고 한다)

for (i = 0; i < n; i++)
    a[i] = b[i] * (x * y);
  1. Ab[i] * (x * y) 전체
  2. Bx * y
  3. Ca[i]에 대한 대입
정답과 해설 보기

정답: B. x * y

루프 불변식의 이동은 반복할 때마다 같은 값이 되는 계산을 루프 앞으로 내보내 1번만 계산하는 최적화입니다. x와 y는 루프 안에서 바뀌지 않으므로 x * y는 어느 반복에서나 같은 값이 되며, t = x * y를 루프 앞에서 계산하고 a[i] = b[i] * t로 할 수 있습니다. b[i]는 i마다 다른 값이므로 b[i] * (x * y) 전체는 이동할 수 없습니다. a[i]에 대한 대입도 반복마다 다른 요소에 쓰는 것이므로 루프 안에 남깁니다.

  • A. b[i]는 반복마다 바뀌므로 전체는 이동할 수 없습니다.
  • B. 올바릅니다. x * y는 어느 반복에서나 같은 값입니다.
  • C. 대입은 요소마다 필요하므로 루프에 남습니다.
이 분야 연습하기 분야로 돌아가기

컴파일러의 다른 문제

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

이 분야의 비교