看板 C_and_CPP 關於我們 聯絡資訊
開發平台: 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