【问题标题】:use of parfor in matlab for a lattice boltzmann code在 matlab 中使用 parfor 生成格状 Boltzmann 代码
【发布时间】:2013-04-05 00:46:01
【问题描述】:

我正在研究 lattice boltzmann 方法,并且我已经编写了一个 matlab 代码。 我想并行化代码的某些部分,但我是新手,所以我很感激你的帮助。 我想知道这部分是否可以使用parfor(碰撞运算符):

for i=1:lx
    for j=1:ly
        fork=1:9
           f(k,i,j)=f(k,i,j) .* (1 - omega) + omega .* feq(k,i,j);

         end
    end
end      

我尝试用 parfor 替换最外层的 for 循环,但代码似乎更慢。

有什么建议吗?

提前致谢

【问题讨论】:

  • lxly 的值是多少?我可以想象当 for 循环不是那么大时 parfor 实际上会由于开销而变慢
  • 代码中的 lx 和 ly 设置为 400。我尝试使用更高的值,但迭代时间越来越长。
  • 我刚刚对它进行了 1000x1000 的测试,parfor 仍然较慢,但相对更接近for。我注意到,parfor 完全用这个循环淹没了我的记忆,可能是因为它传递了大矩阵。也许这就是问题所在?!
  • 这很奇怪,因为替换最外面的 for 循环并使用 lx=ly=1000 运行算法需要 33 秒而不是 for 循环的 0.4 秒!此外,您对内存使用情况是正确的。
  • 快速检查一下:您确实启动了具有多个可用处理器的 matlabpool,对吗?否则使用 parfor 不会做任何有用的事情。

标签: matlab parallel-processing parfor


【解决方案1】:

您应该能够用一行代码完成整个操作,而无需循环:

f = f.*(1 - omega) + omega .* feq;

在我的 2 核计算机上,以:

f = rand(9,400,400);
feq = rand(9,400,400);

[lx,ly,lz] = size(f);

omega = rand(1);

您的循环需要 0.087933 秒,parfor 循环需要 1.166662 秒,而此方法需要 0.009388 秒。如果可以,请始终矢量化您的代码。

【讨论】:

  • 非常感谢您的回答。我已经对我的代码进行了矢量化,并且获得了与您的情况相同的性能。但我想知道为什么 parfor 需要这么长时间来完成这个计算。
  • 我认为这是开销。由于循环中心的实际操作非常快,所有时间都花在与池通信上,因此并行化没有任何好处。如果操作更加繁重,那么与池对话的开销时间将是相同的,但缓慢的操作将并行完成,并且您会看到速度的整体提升。
  • 我以为就像你说的那样,所以我尝试使用更大的 lx 和 ly 值,但是进行计算所需的时间越来越长。你能用 parfor 给我看看你的代码吗,我可以和我的比较一下吗?
  • 如果增加 BOTH 索引,那么它会变慢,因为您(可能)有少量且有限数量的可用内核,因此您同时也增加了开销。尝试只增加ly,这样您就可以进行相同数量的并行调用。随着ly 的增加,串行和并行计算的时间应该以不同的速率增加,并行速率低于串行速率。对于我的代码,我复制/粘贴了您的代码并将第一个 for 更改为 parfor
猜你喜欢
  • 1970-01-01
  • 2013-08-01
  • 1970-01-01
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 2016-08-30
  • 2017-12-06
  • 1970-01-01
相关资源
最近更新 更多