캐시에 친화적인 데이터 배치
배열 구조체를 설계하고 캐시 지역성에 맞게 데이터를 묶습니다.
캐시에 친화적인 데이터 배치은(는) CoddyKit의 무료 C++ Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C++ Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
메모리 계층 구조
CPU에는 주 메모리보다 훨씬 빠른 여러 캐시 계층(L1, L2, L3)이 있습니다. 캐시에 친화적인 코드는 자주 사용하는 데이터를 CPU 가까이에 유지합니다.
캐시 라인
메모리는 일반적으로 64바이트 단위의 캐시 라인으로 가져옵니다. 1바이트를 읽어도 전체 라인이 로드됩니다. 이를 유리하게 활용하십시오.
참조 지역성
중요한 특성은 다음 두 가지입니다.
- 공간 지역성 — 곧 주변 메모리를 사용하는 특성
- 시간 지역성 — 곧 같은 메모리를 곧 다시 사용하는 특성
연속 저장과 연결 저장
벡터는 데이터를 연속적으로 저장하므로 순회할 때 캐시 친화적입니다. 연결 리스트는 메모리를 흩어 놓기 때문에 매 단계마다 캐시를 소진시킵니다.
// Cache friendly
std::vector<int> v(1000);
for (auto& x : v) ++x;
// Cache UNfriendly
std::list<int> l(1000);
for (auto& x : l) ++x;AoS와 SoA
레코드 배열에는 다음 두 가지 배치 방식이 있습니다.
- AoS (구조체 배열) — 자연스럽지만 한 필드를 순회할 때 모든 필드에 접근합니다.
- SoA (배열 구조체) — 대부분의 반복문이 일부 필드만 사용할 때 더 효율적입니다.
// AoS
struct Particle { float x, y, z, vx, vy, vz; };
std::vector<Particle> particles;
// SoA
struct Particles {
std::vector<float> x, y, z, vx, vy, vz;
};구조체 패킹
패딩을 최소화하려면 멤버를 큰 것부터 작은 순서로 배치하십시오. pahole 같은 도구로 실제 배치를 확인할 수 있습니다.
struct Bad { char c; double d; char c2; }; // padded
struct Good { double d; char c; char c2; }; // smaller거짓 공유
두 스레드가 같은 캐시 라인에 있는 서로 다른 변수에 쓰면 서로의 캐시가 무효화됩니다. 성능에 치명적이므로 64바이트가 되도록 패딩을 추가하십시오.
struct alignas(64) Counter {
std::atomic<int> value;
};핫 데이터와 콜드 데이터 분리
자주 접근하는 핫 데이터와 거의 접근하지 않는 콜드 데이터를 서로 다른 구조체로 분리하십시오. CPU는 핫한 부분만 캐시합니다.
사전 할당
반복적인 재할당을 피하려면 reserve로 벡터를 사전 할당하십시오. 재할당이 일어날 때마다 모든 요소가 복사되므로 비용이 크고 캐시 효율도 떨어집니다.
순차 접근의 이점
배열을 선형으로 훑는 방식이 가장 빠릅니다. 하드웨어 프리페처가 다음 캐시 라인을 예측하여 자동으로 로드하기 때문입니다.
간접 참조 피하기
포인터를 사용하면 CPU가 의존성을 따라가야 합니다. 순회할 때는 std::vector<T*>가 std::vector<T>보다 느립니다. 꼭 필요한 경우에만 간접 참조를 사용하십시오.
최적화 전에 프로파일링하기
“캐시 친화적”이라는 말은 지침이지 규칙이 아닙니다. perf나 VTune 같은 도구로 캐시 누락이 어느 부분에서 성능을 저해하는지 측정한 다음 최적화하십시오.
빠른 확인
같은 크기의 std::list를 순회하는 것보다 std::vector를 순회하는 것이 일반적으로 훨씬 빠른 이유는 무엇일까요?
복습
현대 CPU는 캐시에 크게 의존합니다. 연속된 컨테이너를 우선 사용하고, 특정 필드만 접근할 때는 SoA를 사용하며, 구조체를 패킹하고, 거짓 공유를 피하십시오. perf나 VTune으로 캐시 누락을 프로파일링하여 병목 지점을 찾으십시오.
자주 묻는 질문
“캐시에 친화적인 데이터 배치” 강의는 무료인가요?
네 — “캐시에 친화적인 데이터 배치” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C++ Academy 강의 전체를 잠금 해제할 수 있습니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“캐시에 친화적인 데이터 배치”에서 뭘 배우나요?
배열 구조체를 설계하고 캐시 지역성에 맞게 데이터를 묶습니다. 브라우저에서 직접 실행하는 실습 코드로 C++ Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C++ Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C++ Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“캐시에 친화적인 데이터 배치” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C++ Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C++ Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.