我写了一个简单的化学模拟,它可以并行计算大量网格的属性。因此,我用一个并行循环索引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