【问题标题】:Why is parfor slow despite slicing?尽管切片,为什么 parfor 很慢?
【发布时间】:2019-01-03 16:23:47
【问题描述】:

下面给出了一个简单的parfor 循环。

% fileAddr is a cell array of (size N) of file-addresses
sIdx = nan(N,1);
eIdx = nan(N,1);
errMsg = cell(N,1);
parfor i=1:N
    [sIdx(i),eIdx(i),errMsg{i}] = myFunk(fileAddr{i});
end

函数文件myFun() 加载fileAddr{i} 给出的文件,进行一些计算并返回结果。文件加载部分是最耗时的。我的机器有 4 个物理内核。我尝试了parfor() 与 1、2、3 和 4 名工人的池。每次,时间消耗都差不多。我的理解是,如果不止一名工作人员在load()并行处理文件,程序会运行得更快,但分析器结果显示不同。

谁能解释我在哪里犯了错误?

【问题讨论】:

  • parfor() is NOT a magic wand,不要这样对待。如果文件加载确实是此操作的瓶颈,那么并行化将无法帮助您加快代码速度。 HDD/SSD 都具有有限的读取速度,如果您将其最大化,您将无法获得更快的速度。只有当计算成为瓶颈时,并行化才能为您提供潜在帮助。

标签: matlab parfor matlab-load


【解决方案1】:

您只有 1 个硬盘。一次只有 1 个工作人员可以读取它(它是一个带磁头的高速磁盘!)。它的速度较慢,因为工人正在等待轮到他们换硬盘,所以你没有时间。再加上所有无意中听到的数据发送和共享,你让它变慢了。

你试过spmd吗?但我怀疑它最终会得到与 parfor 相同的结果。

【讨论】:

  • 那么,让它更快的唯一机会就是用 SSD 替换 HDD 吗?
  • @Abhinav 不,SSD 也有同样的限制。它会更快,因为 SSD 更快,而不是因为 parfor
  • 不,我没有尝试过 `spmd' 但我想它会遇到同样的命运,因为每次迭代都依赖于不同的文件。不过我可以试试。
  • @CrisLuengo 将数据放在不同的磁盘上.. 嗯,好建议。数据目前放在两个 4TB 磁盘上。但是迭代器文件名是按顺序排列的,即首先是disk-1的所有文件,然后是disk-2的所有文件。可能是如果我按其他顺序放置文件(磁盘 1 文件,然后磁盘 2 文件等),那么它应该会节省一些。
  • @AnderBiguri:SSD 在并行任务中的工作比旋转磁盘要好得多,因为它们不必寻找。对于旋转磁盘,parfor 不仅会遭受线程同步的开销(可能会减慢 3-5%),还会浪费时间在文件之间来回移动物理磁头(可能会减慢 30,000-500,000%)。 SSD 没有这个限制(它们的随机访问速度仍然有限​​,但非常接近顺序访问速度)。
猜你喜欢
  • 2012-10-25
  • 1970-01-01
  • 1970-01-01
  • 2019-10-02
  • 2010-10-30
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多