很抱歉,目前我无法将我的代码简化为一个最小的示例。这是一大堆图像处理代码。
我有一个循环遍历图像(变量 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 则为空(未定义)。这是为什么?
好的,这是我的解决方案:
function syncTestVar()
global testVar;
save('syncvar.mat', 'testVar');
pctRunOnAll global testVar;
pctRunOnAll load('syncvar.mat');
end
如果有人有更好的方法请告诉我...不过这个方法可行
顺便说一句:需要保存/加载,因为在我的真实程序中,testVar
是一个复杂的结构
我是一名优秀的程序员,十分优秀!