求助一个真实的并行优化问题

beforefly 2007-01-09 05:28:15
在FDTD计算中,计算软件会实时保存一些数据,我将其读出并作傅立叶变换处理,然后删除数据文件。
核心处理如下:

for (fi=0;fi<6;fi++)
{
fp[fi]=fopen(fnc[fi],"r");
if (fp[fi]==NULL)
{
printf("Error open fnc!\n");
break;
}
else
{
for (j=1;j<=jmax[fi];j++)
for (i=1;i<=imax[fi];i++)
{
fscanf(fp[fi],"%lg%lg%lg%lg%lg%lg%lg%lg%lg",&Ex,&Ey,&Ez,&Hx,&Hy,&Hz,&Jx,&Jy,&Jz);
omp_set_num_threads(2);
#pragma omp parallel for schedule(static) private(k)
for (k=0;k<=freqnum;k++)
{
Exf[fi][j][i][k]+=Ex*efac[k];
Eyf[fi][j][i][k]+=Ey*efac[k];
Ezf[fi][j][i][k]+=Ez*efac[k];
Hxf[fi][j][i][k]+=Hx*efac[k];
Hyf[fi][j][i][k]+=Hy*efac[k];
Hzf[fi][j][i][k]+=Hz*efac[k];
}
}
fclose(fp[fi]);

if (fi>=5)
{
for (i=0;i<=5;i++) remove(fnc[i]);
Dealed++;
}
}
}

但是并行优化后的程序竟然远比不优化要慢,大家帮忙看看问题在哪?

...全文
423 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
beforefly 2007-01-09
  • 打赏
  • 举报
回复
我运行在2*P4Xeon上,总共有4个核心,但是我可以用2-3个用来处理,一个要算FDTD

读取文件采用了RAMDisk来缓存,所以消除了大部分的硬盘瓶颈

m2213231说得很对,freqnum才是真正的瓶颈,其数值一般在30-200之间可变,我希望越大越好

static那个是我随便加了一个,其实我对schedule的用法还不懂,可是无论如何也不应该比一个进程还慢啊

t_xz 说不应该优化小循环,不知道同步的影响会有多大,我这里只有两个地方可以分开,一个是k,一个是fi。i和j由于存在顺序读取文件的问题,不能并行化,如果大量的同步影响很大,看来我得分开读取各个文件了

linux下的编程我还是接触不久,VTune我去看看怎么用吧

在循环中没有改变的i,j,fi,freqnum等变量应该不用管他吧
beforefly 2007-01-09
  • 打赏
  • 举报
回复
我运行在2*P4Xeon上,总共有4个核心,但是我可以用2-3个用来处理,一个要算FDTD

读取文件采用了RAMDisk来缓存,所以消除了大部分的硬盘瓶颈

m2213231说得很对,freqnum才是真正的瓶颈,其数值一般在30-200之间可变,我希望越大越好

static那个是我随便加了一个,其实我对schedule的用法还不懂,可是无论如何也不应该比一个进程还慢啊

t_xz 说不应该优化小循环,不知道同步的影响会有多大,我这里只有两个地方可以分开,一个是k,一个是fi。i和j由于存在顺序读取文件的问题,不能并行化,如果大量的同步影响很大,看来我得分开读取各个文件了

linux下的编程我还是接触不久,VTune我去看看怎么用吧

在循环中没有改变的i,j,fi,freqnum等变量应该不用管他吧
赖勇浩 2007-01-09
  • 打赏
  • 举报
回复
omp_set_num_threads(2);

看到这一句,感觉楼主不是在双CPU或者双核的机器上运行

用static的理由我猜是因为并行区域很简单,不太会出现计算量非常不均的情况。
m2213231 2007-01-09
  • 打赏
  • 举报
回复
搂主为什么不用VTune看一下软件的瓶颈在哪里,Sampling和Counter Monitor应该符合你的需求。
磁盘访问一般都会有缓冲区,而且如果从磁盘出的数据量不是很大的话瓶颈不一定会在fscanf。倒是你那个freqnum变量的大小应该可以影响代码的性能吧,如果freqnum很大的话瓶颈有可能就在这里了,总之还是用VTune分析一下比较好。
另外那个schedule为什么用static呀,好像一般用guide的策略比较好吧
h2o0 2007-01-09
  • 打赏
  • 举报
回复
不要让线程来来完成一个很小的工作,这只会增加大量同步操作
我觉得你应该考虑优化最大的这个循环
赖勇浩 2007-01-09
  • 打赏
  • 举报
回复
不太了解什么是FDTD,但简单看了一下你的代码,感觉问题可能在这些地方:

1,你的机器运行在双核或者双CPU机器上吗?如果不是,可能会增加一些切程切换的开销。

2,你的程序,最大的瓶颈应该是对文件的读取,你应该优化这里。比如先用一个线程读取一个文件,然后用另一个线程转化这个文件的数据并处理,先前的读文件线程同时读文件。

568

社区成员

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

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