openMP的效果问题

peaokelvin 2009-10-15 03:52:05
加精

我现在正在尝试利用mpi+openmp混合编程模式来提高程序的速度,但是却发现在一主个循环体中加入openmp并行指导语句之后,并行区域的运行时间不仅没有减少,反而有少量增加,即使是改变调度方式也没有改变,我的硬件环境是集群中的一个双核节点,cpu是intel xeon 3.0G双核,缓存1024KB,内存4G,编译器是 icc 11.0,操作系统是linuxRedHatenterprise
程序并行部分为:
for(iDis=0; iDis<pulLevBox[iLev]; iDis++) {
ulBoxKey1 =iDis *iWavBig;
sFarbox = (psElem_trans + iLev) -> psFarbox_list + iDis;
#pragma omp parallel for private(ulBoxKey2,iPos,pcomfTrn) num_threads(2) schedule(static,1)
for(iSec=0; iSec< sFarbox->iNum; iSec++){
ulBoxKey2 = sFarbox->piBox[iSec] * iWavBig;
iPos = sFarbox -> piAddr[iSec];
pcomfTrn = (psElem_trans + iLev) -> pcomfTrs + iPos;
Trans_Elem0(iWavBig, (pcomfTrn +0), (pscomfCsm+ulCsmOrg+ulBoxKey1 +0),
(pscomfCsm+ulCsmTrn+ulBoxKey2 + 0));
}
}
在并行体中,主要是一个Trans的函数调用,内层循环长度在60左右,外层长度有1000多,为了不产生数据竞争,所以只好选择在内层循环中做并行处理。然而通过统计时间,发现并行之后的时间总是要比串行执行多,串行为8.606s,并行9.311s,实际上内循环的任务量相当,采用奇偶调度后,并不会存在严重的负载平衡问题。我想问一下,之所以并行效果不好,是不是出在了频繁的创建线程上面?对于想这样的双循环模型,如果只能够对内层循环作并行的话,是否只有当内层循环长度远远大于外层循环才能够获得很好的并行效果呢?最后一个问题是,我能否在线程内统计执行时间,然后用reduction的方法将其累加,最终获得每个cpu承担的任务量呢?若果不能我该如何知道双核cpu每个所承担的任务量是否相当呢?

...全文
507 50 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
50 条回复
切换为时间正序
请发表友善的回复…
发表回复
xxxl 2009-10-27
  • 打赏
  • 举报
回复
UP
glx9918 2009-10-27
  • 打赏
  • 举报
回复
9999
glx9918 2009-10-27
  • 打赏
  • 举报
回复
999999
glx9918 2009-10-27
  • 打赏
  • 举报
回复
99999999
BriskJJ 2009-10-26
  • 打赏
  • 举报
回复
路过
wangyuanlizhongfu 2009-10-26
  • 打赏
  • 举报
回复
hao wan hao hao
g258498443 2009-10-26
  • 打赏
  • 举报
回复
up\
haming 2009-10-25
  • 打赏
  • 举报
回复
ding
yaoming1718 2009-10-24
  • 打赏
  • 举报
回复
看看
kakiwihr 2009-10-24
  • 打赏
  • 举报
回复
内层循环长度在60左右
chenchen 2009-10-23
  • 打赏
  • 举报
回复
我来学习一下.
walker0571 2009-10-23
  • 打赏
  • 举报
回复
不是太明白
yefangke 2009-10-23
  • 打赏
  • 举报
回复
UP一下
rb56gf 2009-10-22
  • 打赏
  • 举报
回复
路过看看呢.看看学习学习.
jiangcy8702 2009-10-22
  • 打赏
  • 举报
回复
kan bu dong
tianya921 2009-10-22
  • 打赏
  • 举报
回复
不错.....................
peaokelvin 2009-10-21
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 fanbin23 的回复:]
没看出来为什么不能并行外层循环,尽可能想办法能够让外层循环并行吧。否则开销确实很大,你的猜想是对的。

有几个可能的建议:
如果Trans函数每次执行的开销差不多,可以试试schedule(static),这样调度的开销会小些。如果Trans函数每次执行的开销差别真的很大,可以试试schedule(dynamic,1)。

对于执行时间,我有个馊主意:在循环体中用private变量记录时间,通过omp_get_thread_num把各自线程的时间累加到全局数组对应项中。不过,更好的方法是通过一些线程工具,比如Intel thread profiler之类的来看线程执行时间,更方便一些。
[/Quote]非常感谢您的建议。各种调度方式我都试过了,并没有改观,在循环体中加一个变量对时间统计的方法我之前就是这么做的,但是这种方式统计出的时间是否准确,我并不清楚。如果正确的话,此程序中的两个线程所用时间,确实大体相当,也就是说并非负载平衡的问题。通过改变算法,我已将并行指导语句放到了最上层,现在的结果依然是并行比串行所用时间多,我现在是没辙了。。。
piaopiaoid 2009-10-21
  • 打赏
  • 举报
回复
看看以啊
要积分啊
fcly1981826ly 2009-10-21
  • 打赏
  • 举报
回复
学习了
heg009 2009-10-21
  • 打赏
  • 举报
回复
外行~~~哈哈
加载更多回复(24)

567

社区成员

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

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