看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《tropical72 (藍影)》之銘言: : ----- : /* code 1 - bad opmmp */ : #pragma omp parallel for /* sorry, 是放外面效率較差 */ : for (int iterator=0; iterator<ITER; ++iterator) : for (int i=0;i<SIZE;++i) : in[i] = i + 2680; omp parallel for理論上是放外層效果會好 但你這個case明顯有問題, 資料發生相依性的問題, 也就是下次的結果必須要等這次算完才有, OpenMP當然不會改善你這程式的效能效能 事實上, 以這個case的計算來說, 應該是先來簡化計算, 可以直接得到 in[i] = func(i); // 看起來是 ITER*(2680 +i) 而搭配omp就只要一層迴圈 #pragma omp parallel for for (int i=0;i<size;++i) in[i] = inline_func(i); omp for應該要放的是能夠平行化的運算 比如說 omp for for (int i=0;i<nSize;i++) { for (j=0;j<jMax;j++) data[i] = xxxxxxxx; } 另外還有一些資料相依的做法, 可以指名變數與運算元 如#pragma omp for reduction( +:my_variable) int nSum = 0; #pragma omp parallel { #pragma omp for reduction( +:nSum) for( int i=0; i<10000;i++) for(int j=0;j<300000;j++) nSum += j; } cout << nSum << endl; 總之, 先了解平行化的限制再寫, 會比較好 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.43.51.19
tropical72:謝謝建議,不知是否有合適書籍可供進修? 08/14 23:07
CarbonTube:blog.csdn.net/drzhouweiming/article/details/4093624 08/16 00:06
CarbonTube:http://book.douban.com/subject/3624015/ 08/16 00:06
tropical72:謝謝 C 大推薦, blog 裡的連結也都很精彩,感謝!! 08/16 02:29