matlab - 使用 PARFOR 和 FOR 的不同结果

标签 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 则为空(未定义)。 这是为什么?

最佳答案

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

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

如果有人有更好的方法请告诉我...不过这个方法可行

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

关于matlab - 使用 PARFOR 和 FOR 的不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11779216/

相关文章:

c - 如何使用二维数组的输入端口在 Simulink 中创建 s 函数?

matlab - 组合 2 个矩阵的信息来查找值

python - 如何从图像的热图数据生成边界框数据?

algorithm - 有没有办法在硬件上并行化霍夫曼编码实现?

python - 使用 SciPy 的并行 ODE 集成

c++ - 并行 block 中的非并行for循环

MATLAB ResizeFcn 回调失败

c++ - 错误 127 g++ : Command not found

sql-server - SQL 服务器、pyodbc 和死锁错误

java - 暂停和通知 Java Web 服务中的特定线程