gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 20:07:38 25 4
gpt4 key购买 nike

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com