2012-08-02 77 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是一個複雜的結構