Re: [問題] openMP不適合跑大量的資料?

看板C_and_CPP (C/C++)作者 (mself)時間16年前 (2010/05/23 17:34), 編輯推噓1(106)
留言7則, 3人參與, 最新討論串2/2 (看更多)
開發平台: 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)

05/23 17:57, , 1F
這程式運算量太少,效率瓶頸在 memory access
05/23 17:57, 1F

05/23 18:09, , 2F
clock()在多核心的時候會把cputime相加的
05/23 18:09, 2F

05/23 18:09, , 3F
你改用gettimeofday算時間就會發現其實減少了
05/23 18:09, 3F

05/23 18:10, , 4F
你算到的670可能是兩個核心各335
05/23 18:10, 4F

05/23 18:12, , 5F
而且你帶-O3的話gcc可能會把沒有意義的運算拿掉
05/23 18:12, 5F

05/23 18:15, , 6F
CHUNK 值調低試看看
05/23 18:15, 6F
先謝謝各位~ freesamael 所說的 gettimeofday() 確實有差異 新的測試結果: 平行前 500 msec 平行後 342 msec 此外,也許 memory access 真的有瓶頸,因此沒有達到 2x speedup 有什麼方法可以驗證這個想法嗎 ※ 編輯: mself 來自: 203.73.7.177 (05/23 18:33)

05/23 18:36, , 7F
thread起始和結束就會消耗時間了,跑不到2x啦...
05/23 18:36, 7F
文章代碼(AID): #1B-FQQjI (C_and_CPP)
文章代碼(AID): #1B-FQQjI (C_and_CPP)