首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PARFOR和PARFOR的不同结果

使用PARFOR和PARFOR的不同结果
EN

Stack Overflow用户
提问于 2012-08-02 14:09:43
回答 1查看 602关注 0票数 4

很抱歉,目前我无法将我的代码归结为一个最小的例子。这是一堆图像处理代码。

我有一个循环来迭代图像(变量stphogs中的描述符),并且对每个图像运行一个检测。

代码语言:javascript
复制
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:好的,我把它煮成一个最小的工作示例。它确实是由一个全局变量引起的:

代码语言:javascript
复制
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的输出为空(未定义)。为什么会这样呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-02 15:47:12

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

代码语言:javascript
复制
function syncTestVar()
    global testVar;
    save('syncvar.mat', 'testVar');
    pctRunOnAll global testVar;
    pctRunOnAll load('syncvar.mat');
end

如果有人有更好的方法请告诉我..。不过,这个很管用。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11779216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档