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.

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

2.3 在集群创建

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

2.4 删除

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

另外,如果有并行池在运行,Matlab 左下角会有
在这里插入图片描述
否则,状态是
在这里插入图片描述

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 的结果先出来,是根据计算速度输出的。

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值