应该是parfor吧
【使用和关闭】
使用matlabpool 命令启动多个workers,使用parfor指令。自己的电脑上是4核4进程,开启4个workers:
matlabpool 4
关闭时用 matlabpool close
【语法】
parfor的语法和普通的for语法没有区别:
【并行】
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
复制代码 |