이 문제는 C코드가 실행될 때, CPU 캐시(Cache)가 어떻게 동작하는지 예측하는 능력을 평가한다.

 분석을 위해 다음 코드가 주어진다.

int x[2][128];
int i;
int sum = 0;

for(i = 0; i < 128; i++) {
   sum += x[0][i] * x[1][i];
}

 

 

다음과 같은 조건 하에 이 코드를 실행한다고 가정한다.

  • int 타입의 크기는 4바이트이다.
  • 배열 x의 메모리 주소 0x0에서 시작하며, 행 우선 순위(row-major order)로 저장된다.
  • 아래의 모든 경우에서, 캐시는 처음에 비어 있는 상태이다.
  • 메모리 접근은 배열 x의 요소들에 대해서만 발생한다. 그 외의 모든 변수들은 레지스터에 저장된다.

 

다음 가정들을 바탕으로, 각 케이스별 미스율(Miss rate)을 추정하십시오.

  • A. 케이스 1: 캐시 크기는 512바이트, 직접 사상(Direct-mapped) 방식이며, 캐시 블록 크기는 16바이트라고 가정합니다. 이 경우 미스율은 얼마입니까?
  • B. 케이스 2: 캐시 크기를 두 배인 1,024바이트로 늘린다면 미스율은 얼마입니까?
  • C. 케이스 3: 캐시 크기는 512바이트, LRU(최근 최소 사용) 교체 알고리즘을 사용하는 2-way 세트 연관(Two-way set associative) 방식이며, 캐시 블록 크기는 16바이트라고 가정합니다. 이 캐시의 미스율은 얼마입니까?
  • D. 케이스 3의 경우, 캐시 크기를 더 키우는 것이 미스율을 줄이는 데 도움이 될까요? 그 이유는 무엇입니까?
  • E. 케이스 3의 경우, 더 큰 블록 크기(Block size)를 사용하는 것이 미스율을 줄이는 데 도움이 될까요? 그 이유는 무엇입니까?

 

 

 

추론


기본 데이터 분석

  • 배열 크기 : int x[2] [128]

1행 : 128, 2행 : 128, 128 + 128 = 총 256

  • 데이터 크기 : int 타입의 크기는 4바이트이다.
  0 1 ... 126 127
x[0] int int ... int int
x[1] int int ... int int

 

한 행은 int가 총 128개가 있는 거와 마찬가지이니까. 4Byte * 128 = 512Byte이다.

  • 메모리 배치 : x[0][0]은 0x0에서 시작하며 행 우선 순위로 지정

x[0] 행은 메모리 상에서 0 ~ 511Byte를 소유.

x[1] 행은 메모리 상에서 512 ~ 1023Byte를 소유.

  • 접근 패턴 : 
1. x[0][0] * x[1][0]
2. x[0][1] * x[1][1]
3. x[0][2] * x[1][2]
4. x[0][3] * x[1][3]
5. x[0][4] * x[1][4]
6. x[0][5] * x[1][5]
...
위와 같은 순서로 두 행을 번갈아 가며 접근

A. 케이스 1:

조건 : 캐시 크기 512Byte, 직접 사상 방식, 캐시 블록 크기 16Byte

문제 : 미스율은 얼마인가?

 

조건 정의 : 

  • 캐시 크기 512Byte

 

  • 직접 사상 (Direct-mapped) 방식

직접 사상 방식의 정의 : 메모리의 특정 주소가 캐시의 정해진 단 한곳에서만 저장될 수 있도록 1:1로 매칭시켜둔 가장 단순한 캐시 매핑 구조를 의미한다.

  • 캐시 블록 크기 16Byte

 

'컴퓨터과학(CS) > CS문제 풀이' 카테고리의 다른 글

Solution to Problem 5.12  (0) 2026.01.18
Solution to Problem 5.11  (0) 2026.01.18
Solution to Problem 5.10  (0) 2026.01.18
Solution to Problem 5.9  (0) 2026.01.18
Solution to Problem 5.8  (0) 2026.01.18