메모리 계층 구조

위의 두 루프를 하나로 합치면(루프 융합, loop fusion) N이 클 때 빨라지기 쉬운 이유는 무엇입니까?

for (i = 0; i < N; i++) a[i] = b[i] * 2;
for (i = 0; i < N; i++) c[i] = a[i] + 1;
  1. A곱셈과 덧셈이 하나의 명령으로 합쳐져 계산량이 절반이 되기 때문
  2. Ba[i]를 쓴 직후에 사용할 수 있어 배열 a를 주기억장치에서 다시 읽지 않아도 되기 때문
  3. C루프 횟수가 N회에서 2N회로 늘어나 파이프라인이 채워지기 쉬워지기 때문
정답과 해설 보기

정답: B. a[i]를 쓴 직후에 사용할 수 있어 배열 a를 주기억장치에서 다시 읽지 않아도 되기 때문

별도의 루프인 채로는 첫 번째 루프에서 쓴 a 전체가 캐시에 다 들어가지 않을 만큼 크면, 두 번째 루프에서 처음부터 다시 읽을 때마다 미스가 일어납니다. 융합하면 a[i]를 쓴 직후 같은 반복 안에서 사용하므로 데이터가 캐시나 레지스터에 있는 동안 재사용할 수 있어 주기억장치와의 통신이 줄어듭니다. 계산량은 변하지 않으며, 루프 횟수는 2N회에서 N회로 줄어듭니다.

  • A. 연산의 수는 변하지 않으며 계산량이 절반이 되지는 않습니다.
  • B. 올바릅니다. 쓴 직후에 재사용할 수 있어 배열 a를 다시 읽을 필요가 없어집니다.
  • C. 루프 횟수는 2N회에서 N회로 줄어듭니다.
이 분야 연습하기 분야로 돌아가기

메모리 계층 구조의 다른 문제

  1. 큰 행렬을 전치(transpose)하는 처리(b[j][i] = a[i][j])에서 캐시 미스가 많아지기 쉬운 이유와 대표적인 대책의 조합으로 올바른 것은 무엇입니까?
  2. 일반적인 컴퓨터의 기억 계층에서 상위 계층(CPU에 가까운 쪽)일수록 성립하는 성질로 올바른 것은 무엇입니까?
  3. 캐시의 성능을 평가할 때 미스율만이 아니라 평균 메모리 접근 시간으로 비교해야 하는 이유로 올바른 것은 무엇입니까?
  4. 두 프로그램을 같은 코어에서 번갈아 실행하면, 각각을 단독으로 실행하는 것보다 느려질 수 있습니다. 캐시의 관점에서 가장 적절한 설명은 무엇입니까?
  5. 시간적 지역성의 예로 가장 적절한 것은?

이 분야의 비교