【问题标题】:Trouble with running a parallelized script from a driver script从驱动程序脚本运行并行化脚本的问题
【发布时间】:2015-11-11 16:36:20
【问题描述】:

我正在尝试并行化我的代码,最后我设置了 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:“在 '' 的工作人员上引发了 UndefinedFunction 错误。这可能是因为工作人员无法访问包含 '' 的文件。使用 addAttachedFiles(pool, files) 指定需要的文件附加。有关更多详细信息,请参阅“parallel.Pool/addAttachedFiles”的文档。原因:未定义的函数或变量“”。”

但是,如果我直接运行 Worker12.m,它就可以正常工作。只有当我从驱动程序脚本运行它时才会遇到问题。显然,来自 Outcome #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。

【问题讨论】:

  • 您能否通过将代码最小化为一个可以完整发布的非常简单的示例来重现该错误?
  • Worker 脚本的长度约为 1500 行,但我会看看是否可以创建一个重现错误的迷你示例。可能需要一点时间。
  • @lhcgeneva 我添加了一个例子。现在,我无法让我的代码重新创建以前的结果(这很好,因为这个错误消息看起来比其他错误消息更有帮助,但令人沮丧的是我没有改变任何重大的所以我不知道为什么它的行为不同)。
  • 在我的机器上,您的新示例运行良好,您确定没有错字吗?
  • 我直接从 Matlab 复制并粘贴了我的代码到我在这里的编辑中,所以不应该有错字。如果我直接运行 parpoolexample.m,它对我来说很好,但是一旦我进入命令行并说“run('parpoolexample.m')”,我就会收到错误。

标签: matlab parallel-processing parfor


【解决方案1】:

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

【讨论】:

  • 我昨晚通宵运行了代码,没有使用run(我只是更改了目录),它运行得非常好。看起来run 命令实际上是问题所在。
猜你喜欢
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 2013-07-28
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
相关资源
最近更新 更多