的不同结果对不起,目前我无法将我的代码烧到一个最小的例子。 这是一大堆图像处理代码。使用PARFOR和
我有一个循环遍历图像(描述符在变量stphogs),并为每个图像运行检测。
function hogpatches = extractDetectionsFromImages(stphogs, poselet)
hogpatches = cell(1,length(stphogs));
parfor i = 1:length(stphogs)
tmp = extractDetectionsFromImage(stphogs(i), poselet); %e.g. 1x6 struct
if ~isempty(tmp)
hogpatches{i} = tmp;
end
end
hogpatches = cell2mat(hogpatches);
end
所以这是主循环。但extractDetectionsFromImage
中的函数调用非常深入。
我的问题:用正常的for-loop运行这个结果给出了正确的结果。如上所述使用PARFOR时,hogpatches
只包含5个而不是18个结构。
从哪里可以开始寻找错误?我有一个全局变量,程序确实发生了变化。我已经删除了。还有一个全局变量'config',但是只能读取。其他提示?可能是什么问题呢?
编辑: 即使我只是运行一个迭代(stphogs的大小为1),该PARFOR失败。它与isempty
零件没有任何关系。如果我删除该问题,问题依然存在。
EDIT2: 确定这里我把它煮到最低工作示例。 它确实造成了全局变量:
function parGlobalTest()
global testVar;
testVar = 123;
parfor i = 1:1
fprintf('A Value: %d\n', testVar);
testFunction();
end
end
function testFunction()
global testVar;
fprintf('B Value: %d\n', testVar);
end
在这个例子中。 A的输出将是123,对于B它不会是(未定义)。 这是为什么?
也许东西在你的'extractDetectionsFromImage'函数中不起作用的并行情况。 'forempty(tmp)'在'for'和'parfor'实现中评估为'true'多少次? – slayton 2012-08-02 14:23:06
您可能想问自己的其他问题之一是,如果parfor循环中的事件需要按顺序发生,或者它们实际上可以并行工作。 – 2012-08-02 15:36:22