运行 来自驱动程序脚本的并行化脚本有问题

Trouble with running a parallelized script from a driver script

我正在尝试并行化我的代码,我终于设置了 parfor 循环,这样 Matlab 就不会每次都崩溃。但是,我现在遇到了一个我似乎无法弄清楚的错误。

我有一个驱动程序脚本 (Driver12.m),它调用我试图并行化的脚本 (Worker12.m)。如果我直接 运行 Worker12.m ,它通常可以毫无问题地完成。然而,每次我尝试从 Driver12.m 到 运行 它时,它要么 1) 导致 Matlab 崩溃,要么 2) 向我抛出一个奇怪的错误。这是我的一些代码:

%Driver script
run('(path name)/Worker12.m');

%Relevant worker script snippet
parfor q=1:number_of_ranges
    timenumber = squeeze(new_TS(q,:,:));
    timenumber_shift = circshift(timenumber, [0 1]);
    for m = 1:total_working_channels
        timenumberm = timenumber(m,:);
        for n = 1:total_working_channels
            R_P(m,n,q) = mean(timenumberm.*conj(timenumber(n,:)),2);
            R_V(m,n,q) = mean(timenumberm.*conj(timenumber_shift(n,:)),2);
        end
    end
end

结果 #1:"Matlab has encountered an unexpected error and needs to close."

结果 #2:"An UndefinedFunction error was thrown on the workers for ''. This might be because the file containing '' is not accessible on the workers. Use addAttachedFiles(pool, files) to specify the required files to be attached. See the documentation for 'parallel.Pool/addAttachedFiles' for more details. Caused by: Undefined function or variable "”。”

但是,如果我直接 运行 Worker12.m,它工作正常。只有当我从驱动程序脚本中 运行 时,我才遇到问题。显然,结果 #2 中的这条错误消息并不是那么有用。有什么建议吗?

编辑:所以我创建了一个重现错误的玩具示例,但现在我的玩具示例和原始代码都给了我一个新的第三个错误。这是玩具示例:

%Driver script
run('parpoolexample.m')

%parpoolexample.m
clear all
new_TS = rand([1000,32,400]);
[number_of_ranges,total_working_channels,~] = size(new_TS);
R_P = zeros(total_working_channels,total_working_channels,number_of_ranges);
R_V = zeros(total_working_channels,total_working_channels,number_of_ranges);

parfor q=1:number_of_ranges
    timenumber = squeeze(new_TS(q,:,:));
    timenumber_shift = circshift(timenumber, [0 1]);
    for m = 1:total_working_channels
        timenumberm = timenumber(m,:);
        for n = 1:total_working_channels
            R_P(m,n,q) = mean(timenumberm.*conj(timenumber(n,:)),2);
            R_V(m,n,q) = mean(timenumberm.*conj(timenumber_shift(n,:)),2);
        end
    end
end

结果 #3:"Index exceeds matrix dimensions (line 7)."

因此,在 'parfor' 行,它表示我超出了矩阵维度,尽管我认为情况不应该如此。现在我什至无法获得我的原始脚本来重新创建结果 #1 或 #2。

不要将 runparforspmd 等并行语言结构一起使用。不幸的是,它不能很好地工作。相反,请使用 cdaddpath 让 MATLAB 看到您的脚本。