Matlab 并行

Matlab 并行

  • 1. 检查是否有并行附加功能
  • 2. 创建和删除并行
    • 2.1 创建默认的并行池
    • 2.2 在本地创建
    • 2.3 在集群创建
    • 2.4 删除
  • 3. Parallel pool 包含的一些函数
    • 3.1 parfor
    • 3.2 parfeval

初学,肯定有理解不够的地方。看官方文件更靠谱。

1. 检查是否有并行附加功能

Matlab 并行_第1张图片
如果没有,可以"主页–>附加功能–>获取附加功能",下载一下就好了。

2. 创建和删除并行

2.1 创建默认的并行池

parpool
% 这样就可以了,或者
parpool(num)
% num 为 workers 的个数 

2.2 在本地创建

% 两种环境
parpool('process') 
parpool('local') 
%Start a parallel pool of process workers. 这两个是一样的,process based 是默认环境。

parpool('thread') %Start a parallel pool of thread workers.

怎么选择这两种环境? 官方文件给了下面的的流程图。
Matlab 并行_第2张图片
process based:支持完整的并行语言;版本兼容;更稳健
thread based:相比较,内存少,速度快

2.3 在集群创建

c = parcluster % 创造一个默认配置的集群
parpool(c)

2.4 删除

p = parpool('local);
delete(p) %删除

另外,如果有并行池在运行,Matlab 左下角会有
Matlab 并行_第3张图片
否则,状态是
Matlab 并行_第4张图片

3. Parallel pool 包含的一些函数

3.1 parfor

for 循环用法相似。有很多循环,或者一个循环需要很长时间就可以用 parfor 了。

parfor loopVar = initVal:endVal
	 statements;
end

【Tips:】
a.)因为是分块运算,所以 parfor 中的循环要独立。(不能有类似‘ num=num+1;’ 这种了)
b.)需要所有循环结束才能得到结果。

3.2 parfeval

不用等循环跑完就能得到已经完成的项目的结果

F = parfeval(pool,fcn,numout,X1,...,Xm) % 'pool' is optional

fcn: 是要运行的 function;
numout: function 运行完后输出的结果数量。可以是向量 [ y 1 , y 2 , . . . , y n ] [y_1,y_2,...,y_n ] [y1,y2,...,yn],这属于输出结果数量为1;
X1,…,Xm: 是 function 运行的输入变量;
F: 是一个未来变量,将 function 还没运行结束的对象赋给 F。

a) 在 运行中, 可以通过 F 得到每个并行状态。

p = parpool(2);
for n = 1:5
    if n == 3
        f(n) = parfeval(@pause,0,1);
    else
        f(n) = parfeval(@pause,0,Inf);
    end
end

{f.State}
% ans = 1×5 cell
%    {'running'}    {'running'}    {'queued'}    {'queued'}    {'queued'}

设定了 2 个 workers,因此有三个循环在排队等待。

b) 运行结束,获得运行结果。
fetchOutputs 函数得到输出值。

f = parfeval(@magic,1,10);
value = fetchOutputs(f);

如果在 for 循环里,可以提交多个未来请求,得到向量 f 。 并用 fetchNext 提取结果。

f(1:10) = parallel.FevalFuture; % 预先分配空间
for idx = 1:10
    f(idx) = parfeval(@magic,1,idx);
end
% 提取结果
magicResults = cell(1,10); 
for idx = 1:10
    [completedIdx,value] = fetchNext(f);
    magicResults{completedIdx} = value;
    fprintf('Got result with index: %d.\n', completedIdx);
end

completedIdx 代表原来循环计算的压入 f 的索引号。parfeval 计算输出的结果并不按照顺序,也就是 idx 为 1 的结果并不一定比 idx 为 2 的结果先出来,是根据计算速度输出的。

你可能感兴趣的:(matlab,matlab,开发语言)