作者mself (mself)
看板C_and_CPP
標題Re: [問題] openMP不適合跑大量的資料?
時間Sun May 23 17:34:16 2010
開發平台: gcc/g++, Linux, AMD 5600+ 雙核
使用 openMP 平行 c[i] = a[i] + b[i]
問題:
陣列大小 10^8,資料完全沒有相依性,感覺是很簡單的程式。
平行前執行時間 500 msec
平行後卻變成 670 msec
不曉得大家認為是什麼原因?能否提供一些建議給我
謝謝~
程式附於後,短短的(約30行)
編譯參數
gcc -std=c99 -O3 -fopenmp test.c -o test
程式:
#include <omp.h>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
float *a, *b, *c;
clock_t start, end;
#define NUM 100000000
#define CHUNK 50000000
void main(){
a = malloc(sizeof(float)* NUM);
b = malloc(sizeof(float)* NUM);
c = malloc(sizeof(float)* NUM);
for( int i = 0; i < NUM; i++ ){ //給 a, b 亂數
a[i]=rand();
b[i]=rand();
}
start = clock(); //由此開始計時
#pragma omp parallel for schedule(static, CHUNK)
for(int i=0; i<NUM; i++){
c[i] = a[i] + b[i]; // c = a + b,資料完全獨立
}
end = clock();
printf("time = %.2f ms\n", (end-start)*1000.0/CLOCKS_PER_SEC);
return;
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.59.238.133
※ 編輯: mself 來自: 61.59.238.133 (05/23 17:37)
推 littleshan:這程式運算量太少,效率瓶頸在 memory access 05/23 17:57
→ freesamael:clock()在多核心的時候會把cputime相加的 05/23 18:09
→ freesamael:你改用gettimeofday算時間就會發現其實減少了 05/23 18:09
→ freesamael:你算到的670可能是兩個核心各335 05/23 18:10
→ freesamael:而且你帶-O3的話gcc可能會把沒有意義的運算拿掉 05/23 18:12
→ evilned:CHUNK 值調低試看看 05/23 18:15
先謝謝各位~
freesamael 所說的 gettimeofday() 確實有差異
新的測試結果:
平行前 500 msec 平行後 342 msec
此外,也許 memory access 真的有瓶頸,因此沒有達到 2x speedup
有什麼方法可以驗證這個想法嗎
※ 編輯: mself 來自: 203.73.7.177 (05/23 18:33)
→ freesamael:thread起始和結束就會消耗時間了,跑不到2x啦... 05/23 18:36