我正在學習關於空間局部性的緩存操作。 (我引用至今都原則林和斯奈德,this tutorial並行編程的,當然還有維基百科)。緩存使用,空間局部性和延遲
看看下面的例子,用gcc編譯,在Windows 7 Professional上運行,採用Intel酷睿2雙核CPU( 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有64個字節/ 4個字節= 16個整數),它的大塊還是整個數組一舉陷入?根據我的理解,從RAM加載數據到高速緩存(或從非本地存儲器到本地存儲器的每本教科書)所涉及的等待時間比實際運行例程所需的時間要重要得多。真正?
現在說我們將此代碼移動到多處理器/多核機器,並且代碼的計數部分更改爲在4,8,16等並行線程(使用pthreads)中運行,計算陣列的單獨部分,然後在最後加上私人計數。這是否會導致多次單獨的RAM到緩存延遲事件,使得並行版本比串行版本運行慢?
感謝您的幫助! (沒有足夠的代表upvote - 對不起。)關於_But的任何見解,但是在循環過程中的任何時候,有多少數組可以/不應該加載到緩存中?一次一個緩存行(每個int有64個字節/ 4個字節= 16個整數),它的大塊,或者整個數組一次性下降?_這是我真正無法找到的參考。 – 2012-04-26 19:21:46
@RevWaldo:您可能無法找到參考,因爲它幾乎每個芯片都會發生變化。英特爾/ AMD總是試圖改進緩存預取行爲。最好忽略它,並嘗試將內存訪問佔用空間保留在一個緩存大小的塊中。 – 2012-04-26 23:34:27
解釋爲什麼教科書中的傢伙在解釋績效結果時使用「我們認爲的」很多。再次感謝。 – 2012-04-27 04:15:19