MATALB中SPMD单程序多任务进行任务并行

SPMD(Single Program/Multiple Data)单程序多任务进行任务并行:

并行可分为两种,一种是任务并行(parfor),另一种则数据并行(Spmd)。Spmd中的“Single program”方面指的是同一段代码运行在不同的多个lab上。你在一个Matlab客户端上运行一个程序,被标志为spmd模块的其他部分运行在其他lab上。当这些块运行完毕后,你的程序继续在客户端运行。 “Multiple data”方面指的是虽然spmd语句在所有的lab上运行相同的代码,但每一个lab可以有不同的,独有的数据。所以多数据集可以在多个lab上同时被容纳。当有大数据量需要同时处理,而单机又无法存储大数据量时,可考虑使用数据并行编程方法。Spmd 结构和分布式数组可实现数据并行处理。

以下总结的SPMD使用的两个场景:
1、The "single program" aspect of spmd means that the identical code runs on multiple labs. 就是说同一段程序应用于不同的样本(数据),所以一般针对随机抽样的并行,如

%% SPMD
%example 1
matlabpool local 4
spmd 
   A = rand(3,2); %generate a matrix A for each lab(worker)
end
for i = 1:length(A)
    figure; imagesc(A{i}); 
end
matlabpool close
从下图可以看到,每个lab运行一次

此时的A:

A
 
A =
 
   Lab 1: class = double, size = [3  2]
   Lab 2: class = double, size = [3  2]
   Lab 3: class = double, size = [3  2]
   Lab 4: class = double, size = [3  2]

且当matlabpool close后,A便随着lab的关闭而消失。

A
 
A =
 
    Invalid Composite (the matlabpool in use has been closed)

例子2:

%example 2
a = 3;
b = 4;
matlabpool local 4

spmd
    c = labindex();
    d = c+a;
end
c{2} = 5;
spmd
    f = c*b;
end
for i = 1:length(f)
    fprintf('%d\t',f{i});%access the value of each lab
end
matlabpool close


2、另外,SPMD也可以用于可替代parfor的块并行,在不同lab(worker)上对相同或不同的数据执行不同的并行操作,说起来有些拗口,具体看一下例子就明白了,下面我写的example3,4分别针对在不同lab上对相同数据和不同数据执行不同操作。它们都可以用parfor代替。

%example3 - deal with same Data by different parameters
%add different values to same array Data
Data = 1:100;
matlabpool local 4
spmd
    switch labindex
        case 1
            Data = Data+1;%lab 1上面的数字都加1
        case 2
            Data = Data+2;%lab 2上面的数字都加2
        case 3
            Data = Data+3;%lab 3上面的数字都加3
        case 4
            Data = Data+4;%lab 4上面的数字都加4
    end
end
% print Data{1} & Data{2} for checking
fprintf('%d\t',Data{1});%Horizontal tab
fprintf('%d\t',Data{4});
matlabpool close  

例子4:

matlabpool local 4
spmd
    if labindex == 1
        Data(1:50) = Data(1:50)+1;%lab 1上局部范围数据的+1操作
    else
        Data(51:100) = Data(51:100)+2;
    end
end
dd=Data{1};
dd(1:10);%进行数据测试结果的显示!
matlabpool close
3、composite类型
spmd中每个lab返回值以composite存储,如上面[code]example 1中的f就是以composite的形式展现。f{i}为第i个lab的返回值。最开始我们也可以创建Composite对象并进行初始化赋值。

>>matlabpool local 4

>> f = Composite(4)
 
f =
 
   Lab 1: No data
   Lab 2: No data
   Lab 3: No data
   Lab 4: No data
此时若是按照下面的语句当然是会出错的:


  • 7
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MATLAB,`spmd`(Single Program Multiple Data)是一种用于并行计算的关键字。通过`spmd`关键字,你可以将MATLAB代码分发到多个工作进程并行执行,以加速计算。 下面是一个使用`spmd`关键字进行并行运算的示例: ```matlab % 创建并行池 parpool(); % 使用spmd关键字进行并行计算 spmd % 每个工作进程的代码块 % 在这里编写并行计算的代码 % 可以使用labindex获取当前工作进程的索引 % 示例:计算每个工作进程的平方根 data = [1 4 9 16]; % 假设有四个数据需要计算 result = sqrt(data(labindex)); % 将结果发送给主工作进程 if labindex ~= 1 labSend(result, 1); end end % 主工作进程收集并显示结果 if labindex == 1 results = zeros(1, numlabs); for i = 1:numlabs if i ~= 1 results(i) = labReceive(i); else results(i) = result; end end disp(results); end % 关闭并行池 delete(gcp); ``` 在上述示例,我们使用`spmd`关键字将计算任务分发到多个工作进程,每个工作进程独立地计算其对应数据的平方根,并将结果发送给主工作进程。最后,主工作进程收集所有结果并显示出来。 需要注意的是,在使用`spmd`关键字时,你需要首先创建一个并行池(使用`parpool`函数),然后在`spmd`块内编写并行计算的代码。完成计算后,记得关闭并行池(使用`delete(gcp)`函数)。 这只是`spmd`关键字的一个简示例,你可以根据具体的需求和计算任务进行相应的修改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值