PARFOR循环中的切片变量:MATLAB中的顺序到并行转换

时间:2018-06-04 05:34:45

标签: matlab variables parallel-processing sequential parfor

我在MATLAB中有一个代码,我使用 parfor 而不是简单的 for 循环运行monte-carlo模拟,将代码从顺序转换为并行。以下是 parfor 循环中的代码段。

但是MATLAB给出了一个错误,“local_Q_mega_sub_seed的有效索引在 parfor 循环中受到限制”。建议的操作说“修复索引”,它建议使用“切片变量”。我一直在努力使用这个概念。我已阅读https://blogs.mathworks.com/loren/2009/10/02/using-parfor-loops-getting-up-and-running/#12https://www.mathworks.com/matlabcentral/answers/123922-sliced-variables-in-parfor-loop-restricted-indexing以及MATLAB文档https://www.mathworks.com/help/distcomp/sliced-variable.htmlhttps://www.mathworks.com/help/distcomp/parfor.html,但我说得不对。

有谁能告诉我如何在给定的代码段中使用切片变量以便我能够得到一个想法?

index_f = 1;
subseed_step = (sub_seed_transmitted_at/fs_local)*sintablen_mega_frequency;
for i = 1 : fs_local
local_Q_mega_sub_seed(i) = SINTAB(round(index_f));
local_I_mega_sub_seed(i) = COSTAB(round(index_f));
index_f = index_f + subseed_step;
if index_f>sintablen_mega_frequency
    index_f = index_f - sintablen_mega_frequency;
end

1 个答案:

答案 0 :(得分:1)

你在这里没有显示足够的背景,但我敢打赌这里的问题类似于这个问题:

parfor ii = 1:10
    for jj = 1:10
        tmp(jj) = rand
    end
    out(ii) = sum(tmp);
end

在这种情况下,parfor机制无法明确证明tmp的使用方式与parfor循环的迭代顺序无关。这是因为出现,好像在tmp循环的一次迭代中分配给parfor的值仍在下一次迭代中使用。

幸运的是,对于这种情况,有一个非常简单的解决方法 - 说服parfor通过重置变量,你没有做任何依赖于循环迭代评估顺序的事情。在上面的简单案例中,这意味着:

parfor ii = 1:10
    % reset 'tmp' at the start of each parfor loop iteration
    tmp = [];
    for jj = 1:10
        tmp(jj) = rand
    end
    out(ii) = sum(tmp);
end