1.使用gpu 并行编程
1). 使用语句 gpuDevice(1) 初始化 gpu
2).使用 methods('parallel.gpu.GPUArray') 可以知道gpu支持的函数
A = parallel.gpu.GPUArray.randi(N); % 在gpu上生成 N个随机整型数据
B = log(A); %对这些数据在 gpu上进行log 运算
C = gather(A); %返回到matlab client 中C数组中
2.使用 parfor 语句并行
1). 使用matlabpool 命令启动多个处理单元(matlab 并行计算中称之为labs或 works)
2). 将循环体中的for关键字修改为 parfor 关键字,通过matlab程序解释器将此循环交由matlabpool启动的多个处理单元完成。如下所示:
startmatlabpool;
parfor i= 1: 80
A= i;
end;
3). 使用parfor 尽量减少数据间通信,即运算相对独立,和前后次运算没什么关系。比如
f(i) = f(i - 1) + f(i - 2) 使用parfor则效率较低。其中也有特例,即 简约操作,简约操作应该满足交换律,结合律
x = ; % initialization of x
parfor i = 1 : n
x = x + d( i );
end
上例中,初始化计算时,x仍在matlab client ,循环时被分段分配到matlab worker,各个断独立计算 X。 分段计算的x传输到 matlab client ,然后将各个分段计算x 累加
3.使用 distribute job 实现并行
使用 batch job 批处理 matlab 脚本或matlab 函数
function [out] = batchjobfunc(ib, ie)
parfor kk = ib: ie
data = rand(500, 500);
data = medfilt2 (data, [10, 10]);
out( kk) = sum(data(: ));
end
利用4个matlabpool 并行执行 batchjobfunc 函数如下所示:
sc = findResource('scheduler','configuration','local'); %利用scheduler 管理器找到计算资源
bjob = batch(sc,@batchjobfunc,1,{1,5},'matlabpool',4); % @batchjobfunc 为函数句柄,1表 示1个返回值,{1,5} 是函数传递参数,4 表示分配4个计算池
waitForState(bjob); %等待执行完毕
results = getOutputArguments(bjob;) % 这里得到的result是 cell 类型
A= cell2mat(results); %转化为数组类型
参考文献:
1.刘维.《实战 matlab并行程序设计》.北京航空航天大学出版社.2012