我在 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从另一个文本加载文本文件并在此处和现在将其作为代码运行。
如果有其他方法可以在不使用脚本文件的情况下构建我的代码(如果可能的话,不使用函数;))当然,我也会很感激这样的评论。
非常感谢, 丹尼尔
答案 0 :(得分:2)
parfor
有各种限制,使得在循环中使用脚本通常是一个糟糕的选择。主要的限制是parfor
循环的文本必须是可分析的,以查看可能创建的新变量 - 这被称为"transparency" in the doc。请尝试使用函数。
答案 1 :(得分:0)
因此,对于其他人或可能的改进提示,以下是我使用函数和加载输入变量的方法。
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 ;
更丑陋,工作更多。所以我现在使用上面的save和load方法。