username 发表于 2015-10-6 11:31

perfor和for的区别问题

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

happy 发表于 2015-10-8 10:59

应该是parfor吧

【使用和关闭】
使用matlabpool 命令启动多个workers,使用parfor指令。自己的电脑上是4核4进程,开启4个workers:
    matlabpool 4
关闭时用 matlabpool close
【语法】
parfor的语法和普通的for语法没有区别:
for i = 1:N
    f(i);
end
parfor i = 1:N
    f(i);
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是不可以多层嵌套的,比如下面这样:
parfor i = 1:M
    parfor j = 1:N
    end
end
只有将其中一个改为for:
parfor i = 1:M for i = 1:N ; end end
或者:
for i = 1:M parfor i = 1:N ; end end
但是这样就不能发挥并行的威力,可以这样:
parfor k = 1:M*N
    i = mod(k-1, M) + 1;
    j = floor(k-1/M) + 1;
end

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

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

还有
parfor i = 1:12
    a(i*2) = i*2;
end
这样的操作也是不被允许的。

parfor中限制:
不可以修改循环变量:
parfor i = 1:N
   i = i + 1;
   a(i) = i;
end
当写操作时, 矩阵下标的访问只能是i,或者是i加减一个常数。
如果使用嵌套循环的循环变量来引用矩阵,那么必须用直接的下标形式,不可以用表达式:
A = zeros(4, 11);
parfor i = 1:4
   for j = 1:10
      A(i, j + 1) = i + j;
   end
end
可以改成:
A = zeros(4, 11);
parfor i = 1:4
   for j = 2:11
      A(i, j) = i + j + 1;
   end
end
如果在嵌套循环中引用了矩阵,那么在parfor-loop中就不可以再其他地方再使用:
A = zeros(4, 10);
parfor i = 1:4
    for j = 1:10
      A(i, j) = i + j;
    end
    disp(A(i, 1))
end
是不允许的。可以改成:
A = zeros(4, 10);
parfor i = 1:4
    v = zeros(1, 10);
    for j = 1:10
      v(j) = i + j;
    end
    disp(v(1))
    A(i, :) = v;
end

username 发表于 2015-10-9 07:39

happy 发表于 2015-10-8 10:59
应该是parfor吧

【使用和关闭】


非常感谢,明白了
页: [1]
查看完整版本: perfor和for的区别问题