对不起,目前我无法将代码简化为最小的例子。 这是一大堆图像处理代码。
我有一个循环遍历图像(变量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循环运行它会得到正确的结果。如上所述使用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,它将是空的(未定义)。 那是为什么?
答案 0 :(得分:1)
好的,这是我的解决方案:
function syncTestVar()
global testVar;
save('syncvar.mat', 'testVar');
pctRunOnAll global testVar;
pctRunOnAll load('syncvar.mat');
end
如果有人有更好的方法,请告诉我......这个有效但
Btw:需要保存/加载,因为在我的真实程序中,testVar
是一个复杂的结构