2015-05-06 38 views
0

我现在试图在Matlab中进行并行计算,并希望使用parfor循环来提高效率。问题是我可以保证每个循环都是相互独立的,但我最终需要更新一个全局变量(也许在Matlab中称为广播变量),当我想给它赋值时有一个问题说它不能被分类。如果我仍然想在这个Matlab中做到这一点,我该如何解决这个问题,或者有什么其他方式可以尝试提高效率?使用parfor的广播变量

的代码是这样的:

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

最后一行有一个错字,是这个问题吗? '原子(iBegin,iEnd,:)'应该是'Atoms(iBegin:iEnd,:)'(第一个''应该是':') – PetrH

+0

哪一个是你的全局变量?没有我们可以运行的代码示例,很难理解你的问题。 – David

+0

PetrH你是对的,我其实并不是很熟悉Matlab ......但是我认为它在我改变它之后仍然不起作用:( –

回答

1

你的代码是不可执行的,这使得它有点棘手的工作发生了什么事情,并为@PetrH指出我认为在年底你的索引表达式打算成为Atoms(iBegin:iEnd,:)

要在parfor这项工作,你需要为Atoms安排是sliced广播变量输入到parfor环路是恒定的,同为每次迭代)。换句话说,你的索引表达式需要像

parfor i = ... 
    ... 
    Atoms(i, :) = ...; 
end 

更多的东西说了这么多,如果这是你的整个parfor循环,我反而专注于向量化的东西,而不是应用parfor。看起来parfor循环内的工作量相当小,不太可能给您带来太多好处,而我的猜测是矢量化应该会给您提供更好的加速。

+0

谢谢Edric 。我对Atoms(iBegin:iEnd,:)的错误,正如你所说的,如果Atoms是一个广播变量,那么我不允许在parfor中赋值给它吗?如果我真的想把值赋给一个全局变量我该怎么办?你能解释一下我可以用矢量加速吗? –

+0

对不起*矢量化。 –