openMp改写的程序比串行还慢

最近刚刚接触OpenMp,写了简单的程序,发现在4核4线程运行的时间比4核单线程的时候还要多,不知道为什么,希望有人能帮助我发现一下问题。代码如下:#include<st... 最近刚刚接触OpenMp,写了简单的程序, 发现在4核4线程运行的时间比4核单线程的时候还要多,不知道为什么,希望有人能帮助我发现一下问题。代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <omp.h>

#define length 100

int main(void)
{
unsigned int seed = (unsigned)time(NULL);
int i,j;
float min,max,avg,sum;
max = avg = sum = 0.0;
min = 10.0;

float A[length], B[length], C[length];

#pragma omp parallel for
for(i=0; i<length; i++)
{
A[i] = (rand_r(&seed))%10;
B[i] = (rand_r(&seed))%10;
}

#pragma omp parallel for
for(i=0; i<length; i++)
{
C[i] = (A[i]+B[i])/2;
}

#pragma omp parallel for reduction(+:sum) shared(max,min)
for(i=0; i<length; i++)
{
#pragma omp critical
{
if(C[i]>max) max = C[i];
if(C[i]<min) min = C[i];
}
sum += A[i];
}

avg = sum/length;
printf("The average of array is %f\n", avg);
printf("The smallest element of array is %f\n", min);
printf("The largest element of array is %f\n", max);

return 0;

}

希望有人能帮忙发现一下问题,现在结果运行正确,而且确实是多线程再跑,可是速度比单线程慢好多。谢谢。
晕,那个sum求和是sum+=C[i];另外我想问一下这个并行的部分存在冲突么?
展开
 我来答
我只求真相
推荐于2016-07-02 · TA获得超过490个赞
知道小有建树答主
回答量:147
采纳率:0%
帮助的人:134万
展开全部
运行的慢是因为你的length太小。并行的话比串行需要时间去分,还需要时间再合。所以当你数据量太小时反而用串行的就比较快了。
你换成一亿就能看出差距了。
我没看出来哪有冲突。但是我觉得你上面赋值和算c那这么写也许效率更快。
#pragma omp parallel for
for(i=0; i<length; i++)
{
A[i] = (rand_r(&seed))%10;
B[i] = (rand_r(&seed))%10;
C[i] = (A[i]+B[i])/2;
}
还有,你根本没用到头文件time.h啊。你写这个头文件干嘛?是不是想看运行时间啊。
更多追问追答
追问
嗯,对,我是感觉可能计算量太小了,不过我试着把计算量增大,并且稍微修改了一下,发现加速比还是不好。那个time.h头文件,我之前确实是用来算时间的,后来我用了multi2sim来运行,直接看cycles了,忘记去掉了。。。另外我试着把程序又做了修改,把critical那部分修改了一下,用数组来记录每个线程单独的min和max,最后再把几个线程的min和max进行比较,得到最终结果,实现并行,不过感觉效果还是一般。不知道是怎么回事。
追答
这个时间提高多少呢?如果基本没变,你就要看看你是否用到了openmp.h了,因为就算没成功引用到这个头文件,编译器也会把相应的paralle语句忽略而运行的。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式