【问题标题】:Broadcast variable using parfor使用 parfor 广播变量
【发布时间】:2015-05-06 21:13:29
【问题描述】:

我现在正在尝试在 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

【问题讨论】:

  • 最后一行有错字,是这个问题吗? Atoms(iBegin,iEnd,:) 应该是Atoms(iBegin:iEnd,:)(第一个, 应该是:
  • 你的全局变量是哪一个?如果没有我们可以运行的代码示例,很难理解您的问题是什么。
  • PetrH 你说得对,其实我对Matlab不是很熟悉……但是我觉得改了之后还是不行:(
  • 大卫,全局是 Atoms,它是一个 n×3 矩阵。

标签: matlab parfor


【解决方案1】:

您的代码不可执行,这使得弄清楚发生了什么有点棘手,正如@PetrH 指出的那样,我假设您最后的索引表达式旨在为Atoms(iBegin:iEnd,:)

要在parfor 中进行这项工作,您需要将Atoms 安排为sliced广播 变量是parfor 循环的输入,这些变量是恒定的,对于每次迭代)。换句话说,您的索引表达式需要更像

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

说了这么多,如果这是你的整个parfor 循环,我会专注于矢量化而不是应用parforparfor 循环中的工作量似乎相当小,不太可能给您带来太多好处,而我的猜测是矢量化应该会给您带来更好的加速。

【讨论】:

  • 谢谢埃德里克。我对 Atoms(iBegin:iEnd,:) 有误,正如你所说,如果 Atoms 是一个广播变量,那么我不能在 parfor 中为它赋值,对吧?如果我真的想为全局变量赋值,我该怎么办?你能解释一下我可以通过哪种方式使用矢量来加速?
  • 对不起*矢量化。
猜你喜欢
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 2015-06-27
  • 1970-01-01
相关资源
最近更新 更多