作者WPC001 (突然覺得自己是孤獨的...)
看板C_and_CPP
標題Re: [問題] 問書- about openmp
時間Sun Aug 14 20:56:11 2011
※ 引述《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
推 tropical72:謝謝 C 大推薦, blog 裡的連結也都很精彩,感謝!! 08/16 02:29