我编写了一个简单的化学模拟,它可以并行计算大量网格框的属性。因此,我使用并行循环索引 Y 维度:
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
这工作正常。但是,我使用布尔值来控制是否执行某些操作,如下面的代码所示。for
这在 Y 上使用简单循环时效果很好,但在使用 时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
现在工作正常 if controlArg = true
,但不是 if controlArg = false
; 我发现的唯一解决方法是定义optionalArg
独立于controlArg
. 不用说这是问题的简化版本,但我会感谢任何可以向我解释的人;我怀疑这是parfor
循环与全局变量有关的问题的一个子集,但是由于我没有定义全局变量,所以我有点困惑。
问候,
跳过