很抱歉,目前我无法将我的代码归结为一个最小的例子。这是一堆图像处理代码。
我有一个循环来迭代图像(变量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中的函数调用非常深入。
My问题:使用普通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的输出为空(未定义)。为什么会这样呢?
发布于 2012-08-02 15:47:12
好的,这是我的解决方案:
function syncTestVar()
global testVar;
save('syncvar.mat', 'testVar');
pctRunOnAll global testVar;
pctRunOnAll load('syncvar.mat');
end如果有人有更好的方法请告诉我..。不过,这个很管用。
顺便说一句:保存/加载是必要的,因为在我的实际程序中,testVar是一个复杂的结构
https://stackoverflow.com/questions/11779216
复制相似问题