我已经创建了这个测试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
,那么这些数字就会正确打印出来。
答案 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链接会有所帮助。