2012-08-02 44 views
4

的不同结果对不起,目前我无法将我的代码烧到一个最小的例子。 这是一大堆图像处理代码。使用PARFOR和

我有一个循环遍历图像(描述符在变量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-loop运行这个结果给出了正确的结果。如上所述使用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

也许东西在你的'extractDetectionsFromImage'函数中不起作用的并行情况。 'forempty(tmp)'在'for'和'parfor'实现中评估为'true'多少次? – slayton 2012-08-02 14:23:06

+0

您可能想问自己的其他问题之一是,如果parfor循环中的事件需要按顺序发生,或者它们实际上可以并行工作。 – 2012-08-02 15:36:22

回答

1

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

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

如果有人有更好的方法请告诉我......这一件作品虽然

BTW:保存,因为我真正的需要/负载程序,testVar是一个复杂的结构