如何在 Matlab 的 parfor 循环中使用 M-.file?
How to use a M-.file in a parfor loop in Matlab?
我在 parfor 循环 中的代码越来越长,我想将它拆分。将部分代码 保存在不同的脚本文件 中似乎合乎逻辑且非常有吸引力,因为除了代码保存的位置之外它不会改变任何东西,所以它似乎应该可以工作。但事实并非如此。
我收到了常见的“透明度违规错误”。
这个问题看起来很典型,但我没有发现这个问题在任何地方被问到或回答过。
下面是一个小的工作示例。
(是的,这可以作为一个函数。但是如果有更多的输入和输出变量,这在我看来会变得非常丑陋,而且由于传递参数可能也会变慢)
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 从另一个加载文本文件和 运行 它现在作为代码)。
如果有其他方法可以在不使用脚本文件的情况下构建我的代码(并且,如果可能的话,不只使用函数;))当然,我也会很感激这样的评论。
非常感谢,
丹尼尔
parfor
有各种限制,使得在循环内使用脚本通常是一个糟糕的选择。主要的约束是 parfor
循环的文本必须是可分析的,以查看可能创建的新变量——这被称为 "transparency" in the doc。尝试改用函数。
因此,对于其他人或可能的改进提示,这是我使用函数并加载输入变量的方法。
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 ;
哪个更难看,工作量更大。所以我暂时使用上面的保存和加载方法。
我在 parfor 循环 中的代码越来越长,我想将它拆分。将部分代码 保存在不同的脚本文件 中似乎合乎逻辑且非常有吸引力,因为除了代码保存的位置之外它不会改变任何东西,所以它似乎应该可以工作。但事实并非如此。
我收到了常见的“透明度违规错误”。
这个问题看起来很典型,但我没有发现这个问题在任何地方被问到或回答过。
下面是一个小的工作示例。
(是的,这可以作为一个函数。但是如果有更多的输入和输出变量,这在我看来会变得非常丑陋,而且由于传递参数可能也会变慢)
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 从另一个加载文本文件和 运行 它现在作为代码)。
如果有其他方法可以在不使用脚本文件的情况下构建我的代码(并且,如果可能的话,不只使用函数;))当然,我也会很感激这样的评论。
非常感谢, 丹尼尔
parfor
有各种限制,使得在循环内使用脚本通常是一个糟糕的选择。主要的约束是 parfor
循环的文本必须是可分析的,以查看可能创建的新变量——这被称为 "transparency" in the doc。尝试改用函数。
因此,对于其他人或可能的改进提示,这是我使用函数并加载输入变量的方法。
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 ;
哪个更难看,工作量更大。所以我暂时使用上面的保存和加载方法。