캐시 친화적인 코드 최적화 전략 알아보기
이번 포스트에서는 우리가 실제 코드를 작성할 때 캐시 성능을 높이기 위해 어떤 전략을 적용할 수 있는지를 살펴보겠습니다. 지역성(Locality) 개념을 잘 활용하면, 동일한 알고리즘이라도 훨씬 더 빠르게 동작할 수 있게 되지요.
캐시 친화적 코드의 중요성
앞서 배운 것처럼 캐시 적중률(Cache Hit Rate)이 높을수록 CPU는 상대적으로 느린 메모리로부터 데이터를 가져오지 않아도 되어, 보다 빠르게 데이터를 처리할 수 있는데요. 따라서 캐시에 잘 맞는 코드를 작성하는 것이 성능 최적화의 핵심이 됩니다.
캐시 친화적인 코드 작성 전략
- 배열을 순차적으로 접근하기 (Stride-1)
- 공간 지역성(spatial locality)을 극대화
- 중첩 루프에서 메모리 접근 순서에 주의하기
- 행 우선(row-major) 접근: C에서는 행이 연속 저장됨
- 불필요한 메모리 접근 줄이기
- 같은 값을 반복해서 읽지 않도록 캐시나 레지스터에 저장
- 데이터 구조 설계 시 메모리 배치 고려하기
- 구조체 내 필드 순서, padding 최소화 등
예시: 행렬 전치와 지역성
행렬 전치(transpose)를 예로 들면, 다음 두 코드는 같은 작업을 하지만 성능 차이가 큽니다.
// 캐시 친화적이지 않음
for (i = 0; i < N; i++)
for (j = 0; j < N; j++)
B[j][i] = A[i][j];
// 캐시 친화적
for (j = 0; j < N; j++)
for (i = 0; i < N; i++)
B[j][i] = A[i][j];
CPU의 쓰기 동작은 캐시에 영향을 더 크게 받는데요. 때문에 쓰기 대상 배열인 B에 대해 캐시 친화적으로 접근해야 전체 성능을 보다 향상시킬 수 있습니다. 이때 C에서는 배열이 행 우선(row-major)으로 저장되므로, i가 안쪽 루프에 있을 때 배열 B에 대해 메모리를 연속적으로 접근하게 되어 캐시 효율이 좋아집니다.
기타 전략들
- 루프 블로킹(Loop Blocking)
- 큰 배열을 블록 단위로 쪼개서 처리해, 작은 데이터 집합을 캐시에 유지
- 구조체와 배열 선택
- 배열을 사용하면 데이터가 연속되게 저장되므로 더 캐시 친화적
- 캐시 라인 크기 인지
- 대부분 64바이트, 데이터를 읽을 때 전체 라인을 불러옴
- 이를 쓸모 있는 데이터로 채우는 것이 중요
마치면서
이번 편에서는 캐시 성능을 고려해 현실적인 코드 최적화를 어떻게 수행할 수 있는지를 살펴봤는데요. 지역성을 최대한 활용하는 것, 메모리 접근 패턴을 이해하고 설계하는 것이 빠른 프로그램을 만드는 핵심이라고 할 수 있습니다.
다음 편에서는 지금까지 배운 내용을 종합해서, 캐시가 프로그램 성능에 미치는 실제 영향을 평가하고 6장을 마무리해보겠습니다. 감사합니다!
'크래프톤 정글 > 컴퓨터구조(CSAPP)' 카테고리의 다른 글
[CSAPP 11장 완전 정복] 11.1 소켓 프로그래밍을 위한 클라이언트-서버 모델 개념 잡기 (0) | 2025.05.01 |
---|---|
[CSAPP 6장 완전 정복] 6.6~6.7 캐시가 프로그램 성능에 미치는 영향 및 6장 전체 요약 (0) | 2025.04.30 |
[CSAPP 6장 완전 정복] 6.4 캐시 메모리 핵심 정리 (0) | 2025.04.29 |
[CSAPP 6장 완전 정복] 6.3 메모리 계층구조 제대로 이해하기 (0) | 2025.04.29 |
[CSAPP 6장 완전 정복] 6.1~6.2 저장장치 기술과 지역성(Locality) 개념 이해하기 (0) | 2025.04.28 |