메모리 계층 구조

큰 행렬을 전치(transpose)하는 처리(b[j][i] = a[i][j])에서 캐시 미스가 많아지기 쉬운 이유와 대표적인 대책의 조합으로 올바른 것은 무엇입니까?

  1. A이유는 계산이 많은 것. 대책은 부동소수점을 정수로 바꾸는 것
  2. B이유는 읽기가 띄엄띄엄해지는 것. 대책은 쓰기 쪽만 연속으로 하는 것
  3. C이유는 읽기와 쓰기 중 한쪽이 열 방향이 되는 것. 대책은 블록 단위 전치
정답과 해설 보기

정답: C. 이유는 읽기와 쓰기 중 한쪽이 열 방향이 되는 것. 대책은 블록 단위 전치

전치에서는 a를 행 방향으로 읽으면 b에는 열 방향으로 쓰게 되고, 반대로 b를 행 방향으로 쓰면 a를 열 방향으로 읽게 되므로, 어느 한쪽은 반드시 띄엄띄엄한 접근이 됩니다. 그래서 행렬을 캐시에 들어가는 작은 블록으로 나누고 블록 안에서 전치하면, 읽어 온 라인을 다 사용한 뒤에 다음으로 넘어갈 수 있어 미스가 크게 줄어듭니다. 쓰기 쪽만 연속으로 해도 읽기가 띄엄띄엄해질 뿐이어서 근본적인 해결이 되지 않습니다. 계산량의 문제도 아닙니다.

  • A. 전치는 계산이 거의 없으며, 타입을 바꿔도 해결되지 않습니다.
  • B. 한쪽을 연속으로 해도 다른 쪽이 띄엄띄엄해질 뿐입니다.
  • C. 올바릅니다. 반드시 한쪽이 열 방향이 되므로 블록 단위로 전치합니다.
이 분야 연습하기 분야로 돌아가기

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

  1. 일반적인 컴퓨터의 기억 계층에서 상위 계층(CPU에 가까운 쪽)일수록 성립하는 성질로 올바른 것은 무엇입니까?
  2. 캐시의 성능을 평가할 때 미스율만이 아니라 평균 메모리 접근 시간으로 비교해야 하는 이유로 올바른 것은 무엇입니까?
  3. 두 프로그램을 같은 코어에서 번갈아 실행하면, 각각을 단독으로 실행하는 것보다 느려질 수 있습니다. 캐시의 관점에서 가장 적절한 설명은 무엇입니까?
  4. 시간적 지역성의 예로 가장 적절한 것은?
  5. C 언어의 2차원 배열 a[i][j]를 위와 같이 안쪽 루프를 j로 하여 순회하면, 안쪽을 i로 하는 것보다 빨라지기 쉽습니다. 그 이유는 무엇입니까?

이 분야의 비교