【问题标题】:How to use a M-.file in a parfor loop in Matlab?如何在 Matlab 的 parfor 循环中使用 M-.file?
【发布时间】:2015-05-14 00:33:10
【问题描述】:

我在 parfor 循环 中的代码越来越长,我想将其拆分。将部分代码保存在不同的脚本文件中 看起来合乎逻辑且非常有吸引力,因为除了保存代码的位置之外它不会改变任何东西,看起来它应该可以工作。但事实并非如此。

我收到通常的“违反透明度错误”。

这个问题看起来很典型,但我在任何地方都没有发现这个问题被问或回答。

下面是一个小的工作示例

(是的,这可以作为一个函数。但如果输入和输出变量更多,这在 imo 中变得非常丑陋,并且可能由于传递参数而更慢)

C = NaN(10,1); %Result vector
parfor loop = 1:10
    a = 1;
    b = 2;

    MFile_Test %Run the m-file which contains only one line:
    % c = a + b;

    C(loop)=c;

end

MFile_Test 是一个仅包含一行 c = a + b 的脚本。

我开始明白为什么并行计算在这里有问题,但不知道如何解决它。因为如果我在 parfor 文件中只有 c = a + b 行,这将毫无问题,我无法相信没有简单的方法来解决这个问题(例如,在最坏的情况下,告诉 matlab 从另一个加载文本文件并在此处和现在将其作为代码运行)。

如果有其他方法可以在不使用脚本文件的情况下构建我的代码(并且,如果可能,不只使用函数;))当然,我也会很感激这样的 cmets。

非常感谢, 丹尼尔

【问题讨论】:

  • 顺便说一句,我还尝试了 addAttachedFiles(gcp,{'mydata'}) 或在脚本中使用 save('mydata') 然后 load('mydata') 但都没有成功。
  • 除了函数我不知道其他方法。 parfor 需要引用正在使用的每个变量。如果您调用脚本,则该引用将丢失。简而言之,您的脚本不再透明。请参阅 thisthis。如果您的问题是由于输入和输出变量的数量而导致代码变得丑陋,那么您可以使用structurescells
  • 作为将所有变量传递给函数的另一种方法,您可以将工作区保存在调用脚本中,然后在函数中再次加载。
  • 你为什么要避开函数? MATLAB 脚本非常适合原型设计,尤其是单元模式脚本,但不应用于结构化编程。我强烈推荐函数。
  • 感谢 cmets。我刚刚开始使用单元格,Parag,但感觉它让我的代码不太清晰。但是好的,我会继续使用它。保存和重新加载工作区的选项对我来说听起来很不错,我会研究一下,谢谢 Cecilia。

标签: matlab parallel-processing parfor


【解决方案1】:

parfor 有各种限制,使得在循环内使用脚本通常是一个不好的选择。主要限制是parfor 循环的文本必须是可分析的,以查看可能会创建哪些新变量——这被称为"transparency" in the doc。尝试改用函数。

【讨论】:

  • 好的,那我就必须这样做了。仍然不明白为什么不能简单地从matlab中读取脚本的文本等于主文件中的文本,但我想那就是我。因此,我会将答案标记为正确以结束问题。谢谢大家。
【解决方案2】:

因此,对于其他人或可能的改进提示,这是我使用函数并加载输入变量的方法。

a = 1;
b = 2;
save('Input.mat');

pseudo_input = NaN;%for the function

D= NaN(10,1);%result vector
parfor loop = 1:10
D(loop) = Parfor_Fun_Test(pseudo_input);
end

函数如下所示:

function d = Parfor_Fun_Test(InputArgs)
load('Input.mat');
d = a + b ;
end

我更愿意在函数中保存输出,即“d”,然后在 parfor 循环中加载它,但这会导致错误,可能是因为同时访问同一个文件以进行加载和保存不同并行工作人员的时间。所以这将不得不这样做。 (这显然可以被saving under a different name 每次都规避,但这可能真的会减慢代码的速度。)

顺便说一句,使用单元格或结构似乎稍微快一些,但是我必须在函数内部编写代码,我假设:

d = Input.a + Input.b ;

这是更丑陋和更多的工作。所以我现在使用上面的保存和加载方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 2014-10-03
    • 1970-01-01
    相关资源
    最近更新 更多