caching - c++ - "캐시 친화적"코드 란 무엇입니까?

c++ / performance / memory / cpu-cache

" cache unfriendly code "와 " cache friendly "코드 의 차이점은 무엇입니까 ?

Keet Sugathadasa



Answer #1

이것은 데이터베이스 시스템이 테이블의 튜플을 선형화하고 저장하는 경우에 의미가 있습니다. 테이블의 튜플을 저장하는 두 가지 기본 방법, 즉 행 저장소와 열 저장소가 있습니다. 이름에서 알 수 있듯이 행 저장소에서 튜플은 행 방식으로 저장됩니다. 저장되는 Product 라는 테이블에 int32_t key, char name[56]int32_t price 의 3 가지 속성이 있으므로 튜플의 총 크기는 64 바이트 라고 가정 해 보겠습니다 .

struct Product
{
   int32_t key;
   char name[56];
   int32_t price'
}

/ * 구조체 배열 생성 * /
Product* table = new Product[N];
/ * 이제 파일 등에서이 구조체 배열을로드합니다. * /
/ * 각 속성에 대해 별도의 배열 생성 * /
int32_t* key = new int32_t[N];
char* name = new char[56*N];
int32_t* price = new int32_t[N];
/ * 이제 파일 등에서 이러한 배열을로드합니다. * /

이제 캐시 친화적 인 코드 부분으로 이동합니다. 테이블의 워크로드가 가격 속성에 대한 집계 쿼리를 가지고 있다고 가정합니다. 같은

SELECT SUM(price)
FROM PRODUCT

행 저장소의 경우 위의 SQL 쿼리를 다음과 같이 변환 할 수 있습니다.

int sum = 0;
for (int i=0; i<N; i++)
   sum = sum + table[i].price;

열 저장소의 경우 위의 SQL 쿼리를 다음과 같이 변환 할 수 있습니다.

int sum = 0;
for (int i=0; i<N; i++)
   sum = sum + price[i];

캐시 라인 크기가 64 바이트 라고 가정합니다 .

캐시 라인을 읽을 때 행 레이아웃의 경우 1 ( cacheline_size/product_struct_size = 64/64 = 1 ) 튜플 의 가격 값만 읽습니다. 이는 구조체 크기가 64 바이트이고 캐시 라인 전체를 채우므로 모든 튜플에 대해 행 레이아웃의 경우 캐시 미스가 발생합니다.