永发信息网

关于openmp的一段程序,不知道为什么有时运行结果不一样。

答案:2  悬赏:80  手机版
解决时间 2021-03-29 18:39
  • 提问者网友:沉默菋噵
  • 2021-03-28 17:43
关于openmp的一段程序,不知道为什么有时运行结果不一样。
最佳答案
  • 五星知识达人网友:琴狂剑也妄
  • 2021-03-28 18:36
楼上的这种critical用法会导致并行计算退化为串行计算,而且比单线程串行反而更慢!

critical一般要配合private使用的,必须在每个线程中hold私有的(private)变量,
最后再用critical把一堆private变量累加。像楼上这种用法,没有private变量,
多个线程互斥性竞争使用同一个变量sum1,导致性能比单线程串行更慢。

用private + critical的写法是:
#pragma omp parallel private(temp)
{
#pragma omp for
for(int j=0,temp=0; j<100; j++)
{
temp++;
}
#pragma omp critical
sum1+=temp;
}

可以看出,这种写法太麻烦,我还是推荐使用简洁的并行归约语句:
#pragma omp parallel for reduction(+:sum1)
for(int j=0;j<100;j++)
{
sum1++;
}
全部回答
  • 1楼网友:逐風
  • 2021-03-28 19:10
#pragma omp for 这条语句是用来指定后面的for循环语句变成并行执行的,当然for循环里的内容必须满足可以并行执行,即每次循环互不相干,后一次循环不依赖于前面的循环。
你代码里#pragma omp for中的多个线程,会同时更改sum1。
所以我觉得应当把sum1++;改为
#pragma omp critical
{
sum1++;
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯