openMp改写的程序比串行还慢

openMp改写的程序比串行还慢,第1张

运行的慢是因为你的length太小。并行的话比串行需要时帆桐兆间去分,还需要时间再合。所以当你数据量太小时反而用串行的就比较快了。

你换成一亿就能看出差距了。

我没看出来哪有冲突。但是我觉得你上面赋值和算c那这么写也许效率更快态租。

#pragma omp parallel for

for(i=0i<lengthi++)

{

A[i] = (rand_r(&seed))%10

B[i] = (rand_r(&seed))%10

C[i] = (A[i]+B[i])/2

}

还有,你根本没用到头文件轮歼time.h啊。你写这个头文件干嘛?是不是想看运行时间啊。

#pragma omp parallel sections {

#pragma omp section

up=temp+h*(8*fp-5*fc[2]+4*fc[1]-fc[0])/仔清睁念岁正游3

#pragma omp section

u=temp+h*(9*fp+19*fc[2]-5*fc[1]+fc[0])/24

}

楼上的这种critical用法会导致并行计算退化为串行计算,而且比单线程串行反而更慢!

critical一般要配合private使用的,必须在每个线程中hold私有的(private)变量

最后再用critical把一堆private变量累加。像楼上这种用法,没有private变量,

多个线程互斥性竞争使用枯胡同一个变量sum1,巧败缺导致性能比孝辩单线程串行更慢。

用private + critical的写法是:

#pragma omp parallel private(temp)

{

#pragma omp for

for(int j=0,temp=0j<100j++)

{

temp++

}

#pragma omp critical

sum1+=temp

}

可以看出,这种写法太麻烦,我还是推荐使用简洁的并行归约语句:

#pragma omp parallel for reduction(+:sum1)

for(int j=0j<100j++)

{

sum1++

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/8235966.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存