如果在外部或在parfor内访问,矢量值会有所不同

时间:2013-06-05 15:53:23

标签: matlab parallel-processing parfor

我已经创建了这个测试Matlab脚本文件:

numbers = [29 37 44 54 62];

for i=1:length(numbers)
    fprintf('%d\n', numbers(i));
end

fprintf('***\n');

matlabpool local 5;
parfor i=1:length(numbers)
    fprintf('%d\n', numbers(i));
end % image loop
fprintf('***\n')
for i=1:length(numbers)
    fprintf('%d\n', numbers(i));
end
matlabpool close;

fprintf('***\n');

for i=1:length(numbers)
    fprintf('%d\n', numbers(i));
end

当我运行它时,我会得到以下输出:

29
37
44
54
62
***
112
111
107
117
115
***
29
37
44
54
62
***
29
37
44
54
62

fprintf块中的parfor打印看似随机的数字集,但总是相同的(112,111,107,117,115)。知道为什么会这样吗?

更新

有趣的是,只有从命令行运行脚本时才会发生这种情况:

matlabR2012b -nodesktop -nosplash -nodisplay -r "run parfortest.m; exit"

如果我首先打开一个Matlab会话并在那里运行parfortest,那么这些数字就会正确打印出来。

3 个答案:

答案 0 :(得分:2)

这特别是run而不是nodesktop问题。要验证这一点,您可以尝试

>> run parfortest.m
从MATLAB桌面

,您将找到相同的输出。

虽然这不是一个解决方案;如果省略run,只需使用

>> parfortest

错误的输出将被纠正。

答案 1 :(得分:1)

我也可以在OS X,R2012b上复制它。在mex中,mexPrintf不是thread safe。见this。如果Matlab的fprintf依赖mexPrintf或类似的代码 - 我会不会感到惊讶。如果您将脚本转换为函数 - 只需将function parfortest放在第一行 - 问题就会消失,因此它也可能是一个范围问题。

编辑:尝试打印超过五个数字,比如十二个。现在使用char将这些值转换为ASCII字符。看起来,在parfor循环中fprintf正在打印出你通过终端命令运行的文件的路径(某种形式的parfortest.m以随机顺序 - 我运行的文件来自~/Desktop/parfortest.m并将号码从fprintf转换为字符D/~ksepotap/frroetst.m)。如果您尝试打印的值多于路径长度,则会出现错误。除了把你的脚本变成一个函数之外我找不到一个解决方法(无论如何这都是一个好主意)。绝对看起来像个错误。

答案 2 :(得分:0)

我猜你不能真正并行写文件。或者在这种情况下输出屏幕,因为fprintf(“text”)暗示fprintf(1,“text”),其中1是输出屏幕的fileID。

现在正在由多个进程修改该文件,这是一个问题,因为在其他操作开始之前未使用的缓冲区被刷新,并且行为将是不正常的。

也许this链接会有所帮助。