你换成一亿就能看出差距了。
我没看出来哪有冲突。但是我觉得你上面赋值和算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++
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)