并行程序效率太低,高手帮忙看看!

bingxingbingxing163 2009-12-09 04:19:05
加精
下面是一个搜索最大数的程序,但并行子函数运行时间大约是串行函数的两倍,大家帮忙看看原因是什么?

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <omp.h>

#define CACHE_LINE_LEN 64
#define data(x) data[x]
#define pnMax(x) pnMax[x]
int *data;

void randData(int count)
{
int i;

data = (int *)malloc(sizeof(int)*count);
srand((unsigned)time(NULL));
for(i=0; i<count; i++)
{
data(i) = (int)(rand()%1000);
}
}

int Parallel_SearchMaxData(int *data,int nLen)
{
int i,k;
int *pnMax;
int pos;
int nCore,nStep,begin,end;
int nMax;

nCore = omp_get_num_procs();
pnMax = (int *)malloc(nCore*(sizeof(int)+CACHE_LINE_LEN));

if(pnMax == NULL)
{
return -1;
}

nStep = nLen/nCore;

#pragma omp parallel for
for(k=0; k<nCore; k++)
{
begin = k*nStep;
end = (k+1)*nStep-1;
if(k == nCore-1)
{
end = nLen-1;
}

nMax = data(begin);
for(i=begin+1; i<=end; i++)
{
if(data(i) > nMax)
{
nMax = data(i);
}
}
pos = k*(sizeof(int)+CACHE_LINE_LEN)/sizeof(int);
pnMax[pos] = nMax;
}

nMax = pnMax(0);
for(i=1; i<nCore; i++)
{
pos = i*(sizeof(int)+CACHE_LINE_LEN)/sizeof(int);
if(pnMax(pos) > nMax)
{
nMax = pnMax(pos);
}
}

free(pnMax);
return nMax;
}

int SearchMaxData(int *data, int nLen)
{
int i;
int nMax;

nMax = 0;
for(i=1; i<nLen; i++)
{
if(data(i) > data(nMax))
{
nMax = i;
}
}

nMax = data(nMax);

return nMax;
}

void main(int argc,char **argv)
{
int count;
int rank1,rank2;
clock_t t1,t2,t3,t4;

printf("Input datasize:\n");
scanf("%d",&count);
randData(count);

t1 = clock();
rank1 = Parallel_SearchMaxData(data,count);
t2 = clock();
printf("Result of parallel searching:\n");
printf("The max data is:%d\n",rank1);
printf("Searching time is:%d\n",t2-t1);

printf("\n");
t3 = clock();
rank2 = SearchMaxData(data,count);
t4 = clock();
printf("Result of serial searching:\n");
printf("The max data is:%d\n",rank2);
printf("Searching time is:%d\n",t4-t3);
}

Input datasize:
100000000
Result of parallel searching:
The max data is:999
Searching time is:1016

Result of serial searching:
The max data is:999
Searching time is:719
请按任意键继续. . .
...全文
1276 87 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
87 条回复
切换为时间正序
请发表友善的回复…
发表回复
wert7588 2009-12-30
  • 打赏
  • 举报
回复
负载分配不合理,改用section块进行任务分解就能提高并行性能或者换种编译语句来提高执行效率,具体的语句谷歌自己查吧
kaith11 2009-12-25
  • 打赏
  • 举报
回复
有那么复杂吗?
chenxing0615 2009-12-19
  • 打赏
  • 举报
回复
把#pragma omp parallel for 后面的for循环体改成函数进行调用试试,用局部变量
aigoo 2009-12-17
  • 打赏
  • 举报
回复
学习
「已注销」 2009-12-15
  • 打赏
  • 举报
回复
我也只为下载积分er来!
whywen_MoJian 2009-12-15
  • 打赏
  • 举报
回复
收藏下。
yy8806998 2009-12-15
  • 打赏
  • 举报
回复
看得我晕乎啊 我功力太浅咯
alalfeng 2009-12-14
  • 打赏
  • 举报
回复
晕,冲电去。
xiaoye 2009-12-14
  • 打赏
  • 举报
回复
mark
I_beyond 2009-12-14
  • 打赏
  • 举报
回复
不是高手,路过
wcqqq 2009-12-14
  • 打赏
  • 举报
回复
wai qai .
bobo415 2009-12-14
  • 打赏
  • 举报
回复
c写的请发到c板块
aboutin 2009-12-14
  • 打赏
  • 举报
回复
学习了
chenchunkai 2009-12-14
  • 打赏
  • 举报
回复
学习了
yikeecko 2009-12-13
  • 打赏
  • 举报
回复
没有看的太懂
zjh333 2009-12-13
  • 打赏
  • 举报
回复
微软又开始软硬联盟了, 你把你电脑配置好点看看呢?
ssgshg 2009-12-13
  • 打赏
  • 举报
回复
有点晕啊,不会
什么时候我才能达到这种水平啊,我努力
cpw1986913 2009-12-13
  • 打赏
  • 举报
回复
我是来学习的。
sharpidd 2009-12-13
  • 打赏
  • 举报
回复
学习了.
victorycan 2009-12-13
  • 打赏
  • 举报
回复
看不懂
加载更多回复(63)

567

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧