2014-05-18 2 views
1

각 메모리 주소는 모듈 캐시 연산에 따라 CPU 캐시에 설정된 자체 캐시에 "매핑"됩니다. 데이터의 물리적 레이아웃으로 인한 캐시 성능 저하

인가가되는 두 개의 동일 크기의 배열과 같이 액세스 방법 : 배열 1의 요소가 [I]과 배열 2 [I]가 동일한 캐시 라인을 제공하기 때문에

int* array1; //How does the alignment affect the possibility of cache collisions? 
int* array2; 

for(int i=0; i<array1.size(); i++){ 
    x = array1[i] * array2[i]; //Can these ever not be loaded in cache at same time? 
} 

에 성능 저하를 유발할 수 모듈로 결과? 또는 두 개의 데이터 위치를 얻기 위해 하나의 캐시 라인 만로드해야하기 때문에 실제로 성능이 향상됩니까?

누군가가 배열의 정렬이 어떻게 영향을 미치는지를 포함하여 캐시 매핑으로 인해 성능 변화를 보여주는 위의 예제를 제공 할 수 있습니까?

(내 질문에 대한 이유는 데이터 조각 중 하나가 캐시에 저장되지 않도록하는 동일한 캐시 줄에 대한 데이터 정렬/주소 매핑으로 인해 성능 문제가 발생했을 때 이해하려고한다는 것입니다.)

NB : 캐쉬 "라인"과 "세트"라는 용어가 섞여있을 수 있으므로 언제든지 수정할 수 있습니다.

+2

예 : http://stackoverflow.com/questions/8547778/why-is-one-loop-so-much-slower-than-two-loops 및 http://stackoverflow.com/questions/12264970/why -is-my-program-slow-when-looping-over-exactly-8192-elements – Mysticial

+0

동시에 캐시 될 수없는 두 개의 주소가 있다고 생각합니까? 이것은 사실이 아닙니다. –

+1

@ n.m. 기술적으로, * 직접 매핑 된 캐시의 경우 두 개의 주소 만 충돌 충돌을 일으킬 수 있습니다. 직접 매핑 된 캐시는 임베디드 시스템에서도 거의 사용되지 않지만 역사적으로 직접 매핑이 자주 사용되었습니다. –

답변

0

지금 코드가 배열에 메모리를 할당하지 않았으므로 코드가 적합하지 않습니다. 포인터는 스택에 앉아서 아무 것도 가리키지 않는 2 개의 초기화되지 않은 변수입니다. 또한 int *에 대한 포인터는 실제로 size() 함수를 가지고 있지 않습니다.

할당량을 모두 고정한다고 가정하면 데이터를 연속적으로 할당할지 여부를 결정할 수 있습니다. 하나의 포인터에 2 * N 정수를 할당하고 그 영역의 중간에 다른 점을 지정할 수 있습니다.

여기서 주요 고려 사항은 배열이 원하는 캐시 레벨을 감싸지 않을 정도로 작 으면 배열을 연속적으로 매핑하면 두 배열 사이에서 동일한 캐시 세트를 공유하지 않아도됩니다. 동일한 세트에 대한 동시 액세스가 HW 고려 사항으로 인해 최적이 아닌 경우가 많으므로 성능이 향상 될 수 있습니다.

스 래싱 고려 사항 (두 배열이 서로 다른 행을 캐시 밖으로 던져 버릴 것임)은 오늘날 대부분의 캐시가 일정 수준의 연관성을 즐길 때 실제로 문제가되지 않습니다. 즉, 배열이 동일한 세트로 매핑 될 수 있지만 라이브로 매핑 될 수 있음을 의미합니다 다른 캐시 방식으로. 배열이 너무 커서 배열의 총 수를 초과하면 주소 범위가 캐시 세트 매핑을 여러 번 감싸는 것을 의미합니다.이 경우 정렬 방법은 중요하지 않지만 여전히 충돌 할 것입니다. 다른 배열의 일부 행을 사용하는 경우

예를 들어 캐시에 4 세트와 2 길이가 있고 정렬 오프셋이있는 64 개의 int 배열 2 개를 매핑하려는 경우 전체 캐시를 채우십시오.

  way0  way1  
set 0 array1[0] array2[32] 
set 1 array1[16] array2[48] 
set 2 array1[32] array2[0] 
set 3 array1[48] array2[16] 

그러나 위에서 언급 한 것처럼 동일한 반복 내에서 액세스는 다른 세트로 이동하여 어떤 이점을 가질 수 있습니다.