공간적 지역성에 관한 캐시 연산을 배우고 있습니다. (내 참조는 지금까지 린 스나이더, this tutorial에 의해 병렬 프로그래밍의 원리, 물론 위키 백과 있습니다.)캐시 사용, 공간 지역성 및 대기 시간
(인텔 코어 2 듀오 CPU를 사용하여, 전문 윈도우 7에서 실행, GCC로 컴파일 다음 예를 보자 L7500).
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int *array;
int length;
int count;
int range;
int i;
// generate an array of a million integers between 0 and 99
length = 1000000;
range = 100;
array = calloc(length, sizeof(int));
srand(time(NULL));
for(i = 0; i < length; i++)
{
array[i] = rand() % range;
// printf("%d\n", array[i]);
}
// count the number of occurrences of 3 in the array
count=0;
for(i=0; i<length; i++)
{
if(array[i]==3)
{
count++;
}
}
printf("count = %6d\n", count);
return 0;
}
지금 루틴의 후반부에서, 정수의 전체 배열은 CPU가 미리 캐시로로드되어야 공간 지역성 당 있도록 판독 될 것이다. 그러나 배열 중 어느 정도가 루프 중에 한 번에 캐시로로드 될 수 있습니까? 한 번에 하나의 캐시 라인 (int = 16 정수 당 64 바이트/4 바이트), 큰 블록 또는 하나의 전체 배열이 급습 했습니까?
또한 RAM에서 캐시로 (또는 로컬이 아닌 로컬 메모리에서) 교과서별로 데이터를로드하는 데 소요되는 대기 시간은 실제로 루틴을 실행하는 데 필요한 시간보다 훨씬 더 중요 할 수 있습니다. . 참된?
이제이 코드를 다중 프로세서/멀티 코어 컴퓨터로 옮기고 코드의 카운팅 부분을 병렬 스레드 (pthread 사용)에서 실행되도록 변경하고 배열의 개별 부분을 계산합니다 마지막에 개인 수를 합산합니다. 이로 인해 RAM 대 캐시 대기 시간이 여러 번 분리되어 병렬 버전이 직렬 버전보다 느리게 실행될 수 있습니까?
도움 주셔서 감사합니다. (upvote에 대한 충분한 담당자가 아님 - 죄송합니다.) 어떤 통찰력에 관한 것입니까? 그러나 루프가 진행되는 동안 어느 정도 배열을 캐시에로드 할 수 있습니까? 한 번에 하나의 캐시 라인 (int = 16 정수 당 64 바이트/4 바이트), 큰 블록 또는 하나의 전체 배열이 급히 떨어 졌습니까? _ 실제로 참조 할 수없는 값입니다. –
@RevWaldo : 거의 모든 칩이 변경되므로 참조를 찾을 수 없습니다. Intel/AMD는 항상 캐시 프리 페치 동작을 개선하려고합니다. 가장 좋은 점은 무시하고 하나의 캐시 크기 블록 내에 메모리 액세스 공간을 유지하려고 노력하는 것입니다. –
교과서에있는 사람들이 성과 결과를 설명 할 때 "우리가 생각하는 것"을 사용하는 이유를 설명합니다. 다시 한번 감사드립니다. –