openMP的效果问题
我现在正在尝试利用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每个所承担的任务量是否相当呢?