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];另外我想问一下这个并行的部分存在冲突么? 展开
#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];另外我想问一下这个并行的部分存在冲突么? 展开
1个回答
展开全部
运行的慢是因为你的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啊。你写这个头文件干嘛?是不是想看运行时间啊。
你换成一亿就能看出差距了。
我没看出来哪有冲突。但是我觉得你上面赋值和算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语句忽略而运行的。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询