Нарезанные переменные в цикле PARFOR: Последовательное в параллельное преобразование в MATLAB - PullRequest
0 голосов
/ 04 июня 2018

У меня есть код в MATLAB, в котором я запускаю симуляции Монте-Карло, используя parfor вместо простого цикла для для преобразования кода из последовательного в параллельный.Ниже приведен фрагмент кода, который находится внутри цикла parfor .

Но MATLAB выдает ошибку о том, что «допустимые индексы для local_Q_mega_sub_seed ограничены в parfor loop».Предлагаемое действие говорит «Исправить индекс» и предлагает использовать «Sliced ​​Variables».Я изо всех сил пытался использовать эту концепцию.Я прочитал https://blogs.mathworks.com/loren/2009/10/02/using-parfor-loops-getting-up-and-running/#12 и https://www.mathworks.com/matlabcentral/answers/123922-sliced-variables-in-parfor-loop-restricted-indexing вместе с документацией MATLAB https://www.mathworks.com/help/distcomp/sliced-variable.html и https://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 голосов
/ 04 июня 2018

Вы не показываете достаточно контекста здесь, но держу пари, что проблема здесь похожа на эту:

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
...