MATLAB并行:parfor

时间:2025-02-19 08:48:05

【使用和关闭】

使用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