请教一个OpenMP并行计算的问题,为什么并行后反而比串行更慢一倍

luxiaofan1986 2010-05-07 09:03:16
我的程序代码是:

void wd(int N,double *h,double *g,double *c0,double *c,double *d)
/* wavelet decomposition 小波分解 */
{
int k,n,l;
#pragma omp parallel for
for(k=0;k<N;k=k+2)
{
double ck=0.0,dk=0.0;
for(l=0;l<8;l++)
{
n=k+l;
ck=ck+c0[n%(N+1)]*h[l];
dk=ck+c0[n%(N+1)]*g[l];
}
c[k]=ck;
d[k]=dk;
}

}

//h,g分别是两个滤波器系数 前面有db4函数产生这两个系数


为什么我这样运行了并行的速度反而比串行慢一倍呢??
如果我想在内层再做一次并行的话该怎么办呢??

希望各位师傅帮帮忙,我刚开始学习OpenMP,一些OpenMP的内容看了,但是实际操作总是出现问题,希望大家指导
...全文
875 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
y456789 2010-05-24
  • 打赏
  • 举报
回复
并行化后慢一倍很正常,慢更多的可能性都有. 请注意并行粒度.
peaokelvin 2010-05-21
  • 打赏
  • 举报
回复
首先应当把并行域内的该私有化的变量进行私有化,如果这个函数整体运行时间很短的话,不建议你进行并行,根据我的经验,如果外层循环N<10*线程数,那么应该不会有很好的并行效果,当然如果是慢了一倍,那就不对了,建议你在运行的时候观察cpu的使用情况,如果是linux下,打top然后按1,进行观察;如果是windows直接在人物管理器中看一看。
intel_www 2010-05-08
  • 打赏
  • 举报
回复
N的值大小在什么数量级?函数wd是不是被调用很多次?如果N多数时候不大且wd的调用次数很多是parallel overhead就会很大,这样就会出现并行反而比串行慢的情况

567

社区成员

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

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