각 메모리 주소는 모듈 캐시 연산에 따라 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 : 캐쉬 "라인"과 "세트"라는 용어가 섞여있을 수 있으므로 언제든지 수정할 수 있습니다.
예 : 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
동시에 캐시 될 수없는 두 개의 주소가 있다고 생각합니까? 이것은 사실이 아닙니다. –
@ n.m. 기술적으로, * 직접 매핑 된 캐시의 경우 두 개의 주소 만 충돌 충돌을 일으킬 수 있습니다. 직접 매핑 된 캐시는 임베디드 시스템에서도 거의 사용되지 않지만 역사적으로 직접 매핑이 자주 사용되었습니다. –