我寫了一個簡單的化學模擬,它可以並行計算大量網格的屬性。因此,我用一個並行循環索引Y維:PARFOR with if/else clause based on external boolean
function[outputArray] = stackTest()
numX = 10;
numY = 10;
numZ = 10;
outputArray = zeros(numX,numY,numZ);
for iX = 1:numX
parfor iY = 1:numY
coreArray = outputArray(iX,iY,:);
for iZ = 1:numZ
tempNum = iX*iY*iZ;
coreArray(1,1,iZ) = tempNum;
end
outputArray(iX,iY,:) = coreArray;
end
end
end
這工作正常。但是,我正在使用布爾值來控制是否執行某些操作,如下面的代碼所示。當使用Y上簡單for
循環,但使用parfor
時也能正常工作,該代碼失敗,並聲稱optionalArg
沒有定義:
function[outputArray] = stackTest(controlArg)
numX = 10;
numY = 10;
numZ = 10;
outputArray = zeros(numX,numY,numZ);
if (controlArg)
optionalArg = 10;
end
for iX = 1:numX
parfor iY = 1:numY
coreArray = outputArray(iX,iY,:);
for iZ = 1:numZ
tempNum = iX*iY*iZ;
if controlArg
tempNum = tempNum * optionalArg;
end
coreArray(1,1,iZ) = tempNum;
end
outputArray(iX,iY,:) = coreArray;
end
end
end
stackTest
現在工作正常,如果controlArg = true
,但如果controlArg = false
;我發現的唯一方法是定義optionalArg
獨立於controlArg
。毋庸置疑,這是問題的簡化版本,但我會感謝任何能向我解釋這一點的人;我懷疑這是parfor
循環與全局性問題的一個子集,但由於我沒有定義全局變量,所以我有點困惑。
問候,
Skipsh
不幸的是,這個問題比我在這裏給出的更復雜 - 如果controlArg爲true,那麼定義了一大堆其他變量(由optionalArg表示)並定義了一組額外的計算(特別是氣溶膠化學,因爲它是值得的)我猜我很困惑,因爲如果我使用'for',只有'parfor'沒有錯誤,我可以按照你所建議的方式解決它,但是這很令人沮喪,因爲它意味着我有額外的變量聲明不必要 - 將很好地知道爲什麼會發生這種情況! – Skipsh 2013-02-20 21:53:06
正如我暗示上面,我猜它發生是因爲matlab分析了parfor塊中的代碼,檢查所有使用的變量在循環內部沒有改變(這會使得循環迭代相互依賴並且不容易並行)並且遇到不必要定義的變量。你的額外變量是幾百萬個元素矩陣嗎?如果不是,那究竟是什麼問題?無論如何,如果存在複雜的計算差異,則應該爲內部部分編寫兩個獨立的函數'complexCalculationWithoutControl'和'complexCalculationWithControl'。 – 2013-02-20 22:02:57
夠公平的。我沒有真正考慮過它可能會使環路相互依賴。我會按照建議重寫代碼 - 謝謝! – Skipsh 2013-02-21 00:20:05