从驱动程序脚本运行并行化脚本时出现问题

时间:2015-11-10 16:45:14

标签: matlab parallel-processing parfor

我正在尝试并行化我的代码,我终于设置了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遇到意外错误,需要关闭。”

结果#2:“在工作者上抛出了未定义的函数错误''。这可能是因为工作人员无法访问包含''的文件。使用addAttachedFiles(pool,files)指定所需的文件有关详细信息,请参阅“parallel.Pool / addAttachedFiles”的文档。引起:未定义的函数或变量“”。“

但是,如果我直接运行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:“指数超过矩阵维度(第7行)。”

所以,在'parfor'一行,它说我超出了矩阵维度,即使我认为不应该这样。现在我甚至无法获得原始脚本来重新创建结果#1或#2。

1 个答案:

答案 0 :(得分:2)

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