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
此时若是按照下面的语句当然是会出错的:
![]()
评论记录:
回复评论: