的不同結果對不起,目前我無法將我的代碼燒到一個最小的例子。 這是一大堆圖像處理代碼。使用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它不會是(未定義)。 這是爲什麼?
也許東西在你的'extractDetectionsFromImage'函數中不起作用的並行情況。 'forempty(tmp)'在'for'和'parfor'實現中評估爲'true'多少次? – slayton 2012-08-02 14:23:06
您可能想問自己的其他問題之一是,如果parfor循環中的事件需要按順序發生,或者它們實際上可以並行工作。 – 2012-08-02 15:36:22