我现在正在尝试在Matlab中进行并行计算,并希望使用parfor循环来提高效率。问题是我可以保证每个循环彼此独立但我最终需要更新一个全局变量(可能在Matlab中称为广播变量),当我想为它分配一些值时,有一个问题说它不能被分类。如果我仍然想在这个Matlab中做到这一点,我该如何解决这个问题,还是有其他方法可以尝试提高效率?
代码是这样的:
Atoms(1:nOfAtomsInTwoDim,:)=TwoDimAtoms;
odd_type=TwoDimAtoms;
even_type=TwoDimAtoms;
even_type(:,1)=TwoDimAtoms(:,1)+LatticeSpacing/2;
even_type(:,2)=TwoDimAtoms(:,2)+LatticeSpacing/2;
parfor i=2:1:nOflayers+1
temp_type=TwoDimAtoms;
if mod(i,2)
temp_type=odd_type;
temp_type(:,3)=TwoDimAtoms(:,3)+(i-1)*LatticeSpacing/2;
else
temp_type=even_type;
temp_type(:,3)=TwoDimAtoms(:,3)+(i-1)*LatticeSpacing/2;
end
iBegin=(i-1)*nOfAtomsInTwoDim+1;
iEnd=i*nOfAtomsInTwoDim;
Atoms(iBegin,iEnd,:)=temp_type;
end
答案 0 :(得分:1)
你的代码不可执行,这使得弄清楚正在发生的事情有点棘手,而且正如@PetrH指出的那样,我假设你的索引表达式最终是Atoms(iBegin:iEnd,:)
。
要在parfor
中完成此工作,您需要安排Atoms
成为sliced(广播变量是parfor
的输入每次迭代都是常量且相同的循环)。换句话说,您的索引表达式需要更像
parfor i = ...
...
Atoms(i, :) = ...;
end
说了这么多,如果这是你的整个parfor
循环,我会专注于向量化而不是应用parfor
。似乎parfor
循环内部的工作量相当小,并且不太可能给你带来太多好处,而我的猜测是矢量化应该会给你带来更好的加速。