컴파일러

루프 전개(루프 언롤링)의 주된 효과로 올바른 것은?

  1. A횟수 판정과 분기의 오버헤드가 줄고 명령도 재배열하기 쉬워진다
  2. B루프의 본체가 1번 분량만 남아 프로그램의 코드가 작아진다
  3. C루프를 함수로 분리하여 다른 곳에서 호출할 수 있게 한다
정답과 해설 보기

정답: A. 횟수 판정과 분기의 오버헤드가 줄고 명령도 재배열하기 쉬워진다

루프 전개는 루프의 본체를 예를 들어 4번 분량 나열해 쓰고 반복 횟수를 4분의 1로 줄이는 최적화입니다. 횟수 판정과 분기 명령이 줄 뿐 아니라, 나열한 본체끼리의 명령을 조합해 재배열할 수 있으므로 연산의 대기 시간을 메우기 쉬워집니다. 그 대신 코드는 커지고 명령 캐시를 압박하기도 합니다. 본체가 1번 분량이 되어 코드가 작아진다는 것은 반대의 설명이며, 루프를 함수로 분리하는 것은 다른 변환입니다.

  • A. 올바릅니다. 분기 등의 오버헤드가 줄고 명령을 재배열하기 쉬워집니다.
  • B. 본체를 여러 개 나열하므로 코드는 오히려 커집니다.
  • C. 함수로 분리하는 것은 다른 변환입니다.
이 분야 연습하기 분야로 돌아가기

컴파일러의 다른 문제

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

이 분야의 비교