4

很抱歉,目前我无法将我的代码简化为一个最小的示例。这是一大堆图像处理代码。

我有一个循环遍历图像(变量 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 个结构。

我可以从哪里开始寻找错误?我有一个全局变量,程序确实改变了。我已经删除了。仍然有一个全局变量“配置”,但只能读取。还有其他提示吗?可能是什么问题呢?

编辑:即使我只运行一次迭代(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 的输出为空(未定义)。这是为什么?

4

1 回答 1

1

好的,这是我的解决方案:

function syncTestVar()
    global testVar;
    save('syncvar.mat', 'testVar');
    pctRunOnAll global testVar;
    pctRunOnAll load('syncvar.mat');
end

如果有人有更好的方法,请告诉我......这个虽然有效

顺便说一句:需要保存/加载,因为在我的真实程序中,testVar是一个复杂的结构

于 2012-08-02T15:47:12.030 回答