這似乎是一種開放式的,但我在爲多個處理器和緩存優化一塊C++代碼時遇到了問題。C++代碼的緩存優化
比多處理器更重要的是緩存:我遍歷2嵌套循環
for(int i=0; i<n; i++){
//do a little something here with a single array
for(int j=0; j<whoaAnotherArray[n].size(); j++){
* access array[i][j] and otherArray[i][j] and store in a variable
- an example is: "int x = array[i][j] + otherArray[i][j]"
* compare variable to some other array[index calculated from i and j]
- an example is: "if (x < yetAnotherArray[i*n+j]){ //do something to yetAnotherArray }"
}
}
我的陣列(陣列和otherArray)是非常大大小。 n是它們的大小。
有沒有辦法讓這個緩存更友好?我已經開始使用鏈接列表,這對緩存來說很糟糕。我在某處讀到我的訪問命令[i] [j]也是緩存有效的。
FWIW,這是一個負重循環檢測算法的一部分。
我在想也許因爲我的數組非常龐大(它們是整數btw數組),最好是將它們打散一點以便它們更好地適應緩存?但我不確定這是對的還是如果是,如何去做。
我也開始使用openmp。我一直在做的唯一事情是加入
#pragma omp parallel for
之前的權利for循環,我得到體面的利用。我想了解如何更好地使用並行性,但除了代碼中的循環之外,我不確定我能做什麼。而且一直都是這樣:我試圖保持緩存的友好。
究竟是什麼你想在這裏實現什麼?我相當確信有一個比O(N²)更有效的解決方案。 – jwueller 2010-12-02 22:16:48
通常一個好的編譯器(特別是當你明確地問他時)在循環中插入* precache *指令。 – ruslik 2010-12-02 22:17:35
@elusive道歉,它不是O(N^2),但O(N),因爲我的內部循環不是N.我將解決這個問題... @ruslik我使用g ++,我該怎麼做? – Sam 2010-12-02 22:19:04