perfor和for的区别问题
最近看到一段代码用的是perfor进行循环,不知道perfor和for有什么区别吗?应该是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 happy 发表于 2015-10-8 10:59
应该是parfor吧
【使用和关闭】
非常感谢,明白了
页:
[1]