Matlab 的 parfor 的使用条件

作者: , 共 1144 字

parfor适用于

  • 大量的简单计算的循环。
  • 大量或少量的复杂计算的循环。

不建议在少量的简单计算的循环中使用 parfor ,因为 parfor 本身有计算的损耗。

同时有很多情况不能使用 parfor ,此时 Matlab 会报错。那到底什么情况下可以用什么情况下不能用呢?这需要从 Matlab 的 parfor 循环机制讲起。Matlab 的 parfor 循环内的变量可分为五大类, parfor 对这五类变量有不同的处理方式。如果 Matlab 无法对 parfor 内的某变量进行归类,或者该变量不满足该类别变量的要求,就会导致出错,此时便不能使用 parfor。

具体而言, Matlab 的 parfor 循环内的变量可分为以下五类:

Matlab parfor 变量分类示意图

1、Loop 变量,顾名思义无需多解释。一个限制是循环内不能对循环变量再次赋值:

parfor i = 1:n
    i = i + 1; % not allowed
    a(i) = i;
end

2、Sliced 变量,是指每个循环只访问该变量的特定位置,具体访问位置跟 Loop 变量有关。一个比较简单的理解方式是,循环访问变量的位置必须是「固定」「不重合」的。如果该变量是输出变量(即在循环内被赋值),访问还必须是「连续」的(此时只能是 Loop 变量再加固定的平移量)。该变量不能在循环内动态变换大小。因此有以下的可行以及不可行的情况:

parfor i = 1:n
    x(i) = a(2*i*i);  % allowed;
    y(i+2) = a(i) + b(i+1); % allowed;
    c(i+1) = c(i) + 1; % not allowed;
    z(2*i) = i; % not allowed;
    a(i) = [];  % not allowed;
    a(end+1) = i; % not allowed
end

3、Broadcast 变量,是指外部变量,且在循环内未被重新赋值。

4、Reduction 变量,该变量遍历所有循环,并且跟运行结果无关。Matlab 会自动识别该类变量,并正确输出结果。如下例所示, Matlab 会按正确顺序输出 x2 :

x2 = [];
n = 10;
parfor i = 1:n
    x2 = [x2, i];
    i,
end

有意思的是,上面这段代码里, i 并不一定按照 1 到 10 的顺序输出,但 x2 的结果却必然是 1 到 10。

5、temporary 变量,是指循环内的临时变量,且该变量不会通过 Loop 变量引用(否则该被归类到 Sliced 变量)。

Q. E. D.

类似文章:
编程 » Matlab, 并行计算
我们知道 Matlab 不支持多重 parfor 循环。下面代码会出错:
相似度: 0.198
最近写了一些 Matlab 程序,想起以前想过的一个东西,记录一下。
相似度: 0.162
以下对并行计算的个人理解受到较多质疑,删除之。
上次大规模使用 Matlab 还是本科的时候,当时还是 5.3 版,现在重新尝试它,已经是 7.8 ( R2009a ),而且 R2010b 版都已经发售。而这些版本引入的一个新玩意儿便是面向对象化编程( object-oriented programming , OOP )。
本文结论:不要过度担心 Matlab 的传值调用的效率问题。
相似度: 0.071
编程 » Excel, VBA
Excel VBA 出错时给出的错误信息极少,需要充分利用各种工具来进行调试。
编程 » Matlab
Matlab 在启动时会自动运行脚本startup.m。在这个脚本里可以自动修改当前目录,修改显示方式等等。比如
编程 » Excel
在编辑 Excel 文件时经常遇到的一个问题是,我这边用得好好地,换台机器就变了个样,或者根本用不了。下面是我在日常工作中总结的一些避免这些情况的小技巧。
相似度: 0.066
编程 » Matlab, 代码准则
我所在部门也不是 IT 部门,职位也不是开发职位,但平时工作还是需要大量处理和分析数据、计算和开发各种指标等,还是需要写很多程序,语言以 VBA 和 Matlab。但同时,部门里像着我这种写程序的人并不多,别人并不看我的代码而只关心我提交的结果(说实话,大多数时候即便我写错了也不会有人知道),工作环境也不像专业的 IT 公司或部门,有严格的流程控制和工作平台。我这里没有版本控制、没有自动测试环境、没有代码格式和注释要求,也不需要去 Linux 下干活。我相信国内金融行业有不少人与我处于同样的状态。
编程 » Matlab, swap, 函数包
Matlab 程序效率低下,其中一个原因就是它的参数无法引用,每次都是传值。这不但导致效率问题,要实现某些功能,也需要一些特殊的手段。比如最简单的,如果交换两个变量的值,也就是在 C/C++里的函数 void swap(int& a, int& b),在 C/C++里实现很容易,但在 Matlab 里,你会吗?
编程 » Matlab
Matlab 在启动时会自动运行脚本startup.m。在这个脚本里可以自动修改当前目录,修改显示方式等等。比如
编程 » Matlab
在写 Matlab 程序时,函数的命名方式让人头疼,很难保证刚写的一个函数名在很久以前被用过,成为隐藏的一颗炸弹。