parfor的并行思想是把同一批数据分给for循环中不同的循环体,进行处理。spmd的思想则是不同的数据,用同一个程序处理。当然这个程序内部可以编写针对不同情况的处理代码。spmd的内部实现代码限制很少,spmd的灵活性比parfor要高得多。
spmd的使用方法如下:
startmatlabpool(2) spmd a = magic(labindex )%代码 end closematlabpool;结果:
Lab 1:
a =
1
Lab 2:
a =
1 3
4 2
为了处理不同的情况,spmd实际运行时会获取当前线程编号,用常量labindex表示,等同于openMP的omp_get_thread_num()。
startmatlabpool(2) p = Composite(); p{1} = rand(1,3); p{2} = 'hello'; spmd disp(p); end closematlabpool;结果:
Lab 1:
0.793866004096169 0.536373818464747 0.647201517107599
Lab 2:
hello
composite数据是spmd并行结构中最简单的数据,每个labindex线程只访问composite{labindex}数据。不可越界。在关闭并行环境后所有的composite数据都没了。
composite数据每个部分可以有不同的数据类型。
of course。不过我也没有多台可以分布式计算的电脑,只能试验一下了。
分布式计算的一大问题是数据的管理。下面分为两个部分:
1、客户端分配
客户端(client)使用distributed语句产生分布式数据。默认根据最后一个维度来分配数据,你也可以自己调。下面源码:
startmatlabpool(2) a = rand(5,2); p1 = Composite(); b = rand(5,2); for i = 1:2 p1{i} = a(:,i); end p2 = distributed(b); %p2 = distributed.rand(5,2);%同样可以这样干 spmd disp([p1 getLocalPart(p2)]); end closematlabpool;结果:
Lab 1:
0.101441167942127 0.885325931102933
0.395333513944682 0.140505759300116
0.604619875183008 0.0679844441385649
0.102777340759248 0.890917146877593
0.603123131497137 0.862605458737845
Lab 2:
0.68058153278091 0.239578384767141
0.895975215333032 0.435924760832413
0.584621985559958 0.831829000715115
0.972073878349711 0.212887327746207
0.872288140538251 0.18323345771615
请注意获取p2要使用getLocalPart语句。
2、服务端(线程计算端)分配
startmatlabpool(2) spmd X = [1 2;4 5]; codist = codistributor1d(1, [1 1]);%1表示第一维度切割,行切割,[1 1]表示每个lab分配一行数据 C = codistributed(X, codist); disp([labindex, numlabs]); disp(getLocalPart(C)); end closematlabpool;