使用PARFOR和FOR的结果不同

时间:2012-08-02 14:09:44

标签: matlab parallel-processing

对不起,目前我无法将代码简化为最小的例子。 这是一大堆图像处理代码。

我有一个循环遍历图像(变量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,它将是空的(未定义)。 那是为什么?

1 个答案:

答案 0 :(得分:1)

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

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

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

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