【问题标题】:error while using parfor in matlab在matlab中使用parfor时出错
【发布时间】:2014-02-22 08:10:28
【问题描述】:

我正在使用 parfor 来并行化 matlab 中的循环。代码如下

   parfor i = 1:15

   tmp{i,1} = theta(i) * Fw{i,1}' * var1 * Wi{i,1} * var2 * Fw{i,1} ;

   end 

FW, Wi 是包含矩阵的单元格。 var1, var2 是矩阵。 Theta 是一个向量。

当我执行此代码时,matlab 永远挂起,当我终止代码很长时间后,它显示以下错误。

警告:评估侦听器回调时出错。

主要是 58 使用 main 时出错(第 58 行)

原因: 使用 distcomp.remoteparfor/getCompleteIntervals 时出错

当我在没有 parfor 的情况下执行代码时,它工作正常。

完整代码如下

Fw = cell(15,1);

Wi = cell(15,1);

tmp = cell(15,1);

for i  = 1 : 15
  Fw{i,1} = randn(25344);
  Wi{i,1} = randn(12672);
  theta(i) = 10;
end

var1 = randn(25344,12672);
var2 = randn(12672,25344);
parfor i = 1:15

   tmp{i,1} = theta(i) * Fw{i,1}' * var1 * Wi{i,1} * var2 * Fw{i,1} ;

end 

【问题讨论】:

  • 该方法是我希望您的客户阻止等待结果从工作人员返回的地方。你有我们可以尝试的复制步骤吗?您正在运行哪个版本的 MATLAB?您使用的是什么集群类型?您打开了多大的 matlabpool?
  • 我使用的 matlab 版本是 8.2.0.701 (R2013b)。 Matlabpool 包含 12 个工人
  • 好的。你有我们可以尝试的复制品吗?
  • 你能澄清一下你所说的复制是什么意思吗?
  • 我们可以实际运行的一些代码会重现问题。 sscce.org

标签: matlab parallel-processing


【解决方案1】:

PARFOR 被设计为既可以在单台机器上运行,也可以跨机器集群运行,并且工作进程不共享地址空间。因此,所有数据都必须复制给工人。在您的情况下,您正在制作大量数据以复制到 12 个工作人员中的每个人。我强烈怀疑您观察到的问题是由于数据传输的开销以及每个工作人员需要存储自己的var1var2 副本的事实。

我会尝试:从小得多的数组开始,然后检查一切是否正常。随着您逐渐增加大小,您可能会发现由于机器内存不足而开始出现问题。

var1var2 存储在sharedmatrix 中可能会有所帮助。

【讨论】:

  • var1 + var2 是 5GB - 每个有 13 个副本(主机 + 12 个工作人员),即 65GB。不幸的是,在传输过程中会制作额外的副本,而且您还需要传输 FwWi 的元素。你试过缩小尺寸吗?
  • 它适用于小尺寸的矩阵。无论如何如何使它适用于大型矩阵
  • 根据我的回答,我会尝试将 sharedmatrix 用于常量数据 - var1var2
  • 有什么方法可以直接在matlab脚本中进行多线程编程,而不需要编写MEX文件。
  • MATLAB 中的各种内在操作都是透明的多线程的。例如rand(1000)*rand(1000) 将使用多线程。但这可能不是您的意思 - 在单个 MATLAB 进程中没有办法让多个执行线程执行不同的 MATLAB 代码行 - 只有一个解释器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 2013-06-01
  • 2020-05-22
  • 1970-01-01
相关资源
最近更新 更多