【发布时间】:2015-11-12 18:08:43
【问题描述】:
我正在尝试创建一段并行代码来加速处理一个非常大的(几亿行)数组。为了并行化,我将我的数据切成 8 个(我的核心数)块,并尝试向每个工作人员发送 1 块。然而,看看我的 RAM 使用情况,似乎每一块都发送给每个工人,有效地将我的 RAM 使用量乘以 8。一个最小的工作示例:
A = 1:16;
for ii = 1:8
data{ii} = A(2*ii-1:2*ii);
end
现在,当我使用 parfor 将此数据发送给工作人员时,它似乎发送了完整的单元格,而不仅仅是所需的部分:
output = cell(1,8);
parfor ii = 1:8
output{ii} = data{ii};
end
我实际上在parfor 循环中使用了一些函数,但这说明了这种情况。 MATLAB 是否实际上将完整的单元格data 发送给每个工作人员,如果是,如何使其仅发送所需的部分?
【问题讨论】:
-
如果您的数据是sliced variable,它将被“切片”,并且只有这些切片将传输给工作人员;你在真实代码中使用切片变量吗?
-
我在实际代码中使用了元胞数组,如此处所示。我会研究切片变量函数,谢谢。
-
也许手动进行切片,为每块提交单独的作业:de.mathworks.com/help/distcomp/submit.html
-
注意:此处
parfor循环后面的gather是多余的——gather用于将distributed数组转换为常规的MATLAB 数组。 -
对变量进行切片可能绝对是要走的路。在没有看到您的代码的情况下,我们无法告诉您切片是否正确。
标签: matlab parallel-processing parfor spmd