声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1563|回复: 2

[编程技巧] perfor和for的区别问题

[复制链接]
发表于 2015-10-6 11:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
最近看到一段代码用的是perfor进行循环,不知道perfor和for有什么区别吗?
回复
分享到:

使用道具 举报

发表于 2015-10-8 10:59 | 显示全部楼层
应该是parfor吧

【使用和关闭】
使用matlabpool 命令启动多个workers,使用parfor指令。自己的电脑上是4核4进程,开启4个workers:
    matlabpool 4
关闭时用 matlabpool close
【语法】
parfor的语法和普通的for语法没有区别:
  1. for i = 1:N
  2.     f(i);
  3. end
复制代码
  1. parfor i = 1:N
  2.     f(i);
  3. end
复制代码

【并行】
for 语句是按照i的序列顺序执行的,而parfor是由多个worker同时执行i为不同值的结果
for i = 1:12 fprintf(' %d',i); end 的输出为:
1 2 3 4 5 6 7 8 9 10 11 12
parfor i = 1:12 fprintf(' %d',i); end的输出为:
2 1 10
4 3 11
6 5 12
8 7 9

【嵌套循环】
parfor是不可以多层嵌套的,比如下面这样:
  1. parfor i = 1:M
  2.     parfor j = 1:N
  3.     end
  4. end
复制代码

只有将其中一个改为for:
  1. parfor i = 1:M for i = 1:N ; end end
复制代码

或者:
  1. for i = 1:M parfor i = 1:N ; end end
复制代码

但是这样就不能发挥并行的威力,可以这样:
  1. parfor k = 1:M*N
  2.     i = mod(k-1, M) + 1;
  3.     j = floor(k-1/M) + 1;
  4. end
复制代码


【限制】
在parfor中执行的语句,如果是写操作,则不能相互访问或者改写不同的i执行的结果。例如

  1. parfor i = 1:12
  2.     a(i+1) = a(i) + 1;
  3. end
复制代码

则是不允许的。因为并行操作并不保证a(i)在a(i+1)之前计算完。

还有
  1. parfor i = 1:12
  2.     a(i*2) = i*2;
  3. end
复制代码

这样的操作也是不被允许的。

parfor中限制:
不可以修改循环变量:
  1. parfor i = 1:N
  2.    i = i + 1;
  3.    a(i) = i;
  4. end
复制代码

当写操作时, 矩阵下标的访问只能是i,或者是i加减一个常数。
如果使用嵌套循环的循环变量来引用矩阵,那么必须用直接的下标形式,不可以用表达式:
  1. A = zeros(4, 11);
  2. parfor i = 1:4
  3.    for j = 1:10
  4.       A(i, j + 1) = i + j;
  5.    end
  6. end
复制代码

可以改成:
  1. A = zeros(4, 11);
  2. parfor i = 1:4
  3.    for j = 2:11
  4.       A(i, j) = i + j + 1;
  5.    end
  6. end
复制代码

如果在嵌套循环中引用了矩阵,那么在parfor-loop中就不可以再其他地方再使用:
  1. A = zeros(4, 10);
  2. parfor i = 1:4
  3.     for j = 1:10
  4.         A(i, j) = i + j;
  5.     end
  6.     disp(A(i, 1))
  7. end
复制代码

是不允许的。可以改成:
  1. A = zeros(4, 10);
  2. parfor i = 1:4
  3.     v = zeros(1, 10);
  4.     for j = 1:10
  5.         v(j) = i + j;
  6.     end
  7.     disp(v(1))
  8.     A(i, :) = v;
  9. end
复制代码
 楼主| 发表于 2015-10-9 07:39 | 显示全部楼层
happy 发表于 2015-10-8 10:59
应该是parfor吧

【使用和关闭】

非常感谢,明白了
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-29 21:26 , Processed in 0.066788 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表