我在上個月一直在進行計算機矩陣乘法運算,並且使用openMP和eigen3進行了一些測試。Eigen3矩陣乘法性能取決於處理器?
測試在後續的機器製造:
電腦1:
英特爾酷睿i7-3610QM CPU @ 2,30GHz/6 GB DDR3
電腦2:
六核AMD Opteron(tm)處理器2435 2.60 GHz(2個處理器)/ 16 GB
對於OPENMP後續矩陣的矩陣乘法算法用於:
void matrix4openmp(void)
{
int j;
#pragma omp parallel for
for (j=0;j<N; j+=2){
double v1[N],v2[N];
int i,k;
for (i=0;i<N; i++){
v1[i]=b[i][j];
v2[i]=b[i][j+1];
}
for (i=0; i<N;i+=2){
register double s00,s01,s10,s11;
s00=s01=s10=s11=0.0;
for (k=0;k<N;k++){
s00 += a[i] [k] * v1[k];
s01 += a[i] [k] * v2[k];
s10 += a[i+1][k] * v1[k];
s11 += a[i+1][k] * v2[k];
}
c[i] [j] =s00;
c[i] [j+1] =s01;
c[i+1][j] =s10;
c[i+1][j+1] =s11;
}
}
結果表明後續:
_________________________Computer 1__________Computer 2
序貫________ 232,75600 ___________ 536,21400
OpenMP____________2, 75764 ____________ 7,62024
Eig EN3 _____________ 3,35090 ____________ 1,92970
*的時間以秒爲單位。
*矩陣尺寸爲2700 X 2500和2500×2700
*順序算法是不一樣的OMP,它的M-m個相乘的最簡單的版本,可以在這裏看到:http://pastebin.com/Pc9AKAE8。
*對於eigen3測試,激活SSE2指令。
OpenMP的*使用默認的核心,即窗口檢測,包括虛擬的這個所有的核心。
正如你可以看到OpenMP的版本是第一臺計算機(I7),比eigen3版本上更快。然而,對於計算機2(2個Opteron),eigen3的性能完全超過了OpenMP版本加上在計算機1中進行的所有測試。
任何想法爲什麼我得到這個結果以及爲什麼eigen3在計算機中速度不快1在電腦2中?
你能否讓所有的實現都使用SSE2? Opteron具有更多,更快的內存原始內存時鐘抽取,這使得這是一個明顯不均衡的測試。我會建議至少均衡指令集(通過編譯)和使用的內核數量。 ('taskset')。 –
@高性能標記我忘記補充說,順序版本不使用我發佈它的相同算法,它使用最簡單的版本,它不使用任何優化。這是這個:http://pastebin.com/Pc9AKAE8這就是爲什麼它可能慢得多,因爲它應該只使用緩存和寄存器的ram intead。 – RandomGuy
@ Steve-o我會嘗試在順序和OpenMP中啓用SSE並將其報告給您。所使用的核心數是openMP的默認值,這是Windows在每臺計算機上檢測到的所有虛擬處理器(computer_1中的8個和computer_2中的12個)。當你的意思是「原始記憶時鐘泵」時,你是在談論ram-cpu數據傳輸? – RandomGuy