用一个对于
-loop通过分布式范围(drange
)旨在用于codistributed阵列(如内部的的尺寸分布的显式索引SPMD
声明或通信作业)。对于涉及平行大多数应用对于
-loops你应该首先尝试使用PARFOR
循环。看到并行for循环(PARFOR)。
在某些情况下,你已经有了一个粗粒度应用程序来执行,即一个应用,其运行时间比启动和停止程序所需要的通信时间显著更大。如果你不想与界定工作和任务的开销打扰,你可以采取优势的易于使用的是SPMD
提供。如果现有程序可能需要数小时或数天来处理其所有独立的数据集,您可以通过在集群分发这些独立计算缩短到时候。
例如,假设您有以下串行代码:
结果=零(1,numDataSets);对于i = 1:numDataSets负载([ '\\中央\ myData的\数据集' int2str(I) '.MAT'])结果(1)= processDataSet(ⅰ);端情节(1:numDataSets,结果);保存\\中央\ myResults \ today.mat结果
下面的变化使该代码并行操作,无论是在交互中SPMD
或在通信工作:
结果=零(1,numDataSets,codistributor());对于i = drange(1:numDataSets)负载([ '\\中央\ myData的\数据集' int2str(I) '.MAT'])结果(1)= processDataSet(ⅰ);端RES =聚集(结果,1);如果labindex == 1个图(1:numDataSets,RES);打印-dtiff -r300 fig.tiff;保存\\中央\ myResults \ today.mat水库结束
需要注意的是的长度对于
迭代和codistributed阵列的长度结果
需要以匹配索引到结果
内对于drange
循环。这样一来,需要工人之间没有沟通。如果结果
只是一个复制的阵列,因为它会一直运行在并行的原代码时,每个工人会分成其组成部分结果
,留下的剩余部分结果
0。在结束时,结果
本来是一个变体,并且没有显式调用labSend
和labReceive
要么g催化剂
,就没有办法得到总的结果返回给一个(或全部)的工人。
当使用加载
功能,你需要小心的是,数据文件是对所有员工都可以访问,如果必要的。最好的做法是使用显式路径文件的共享文件系统上。
相应地,当使用保存
功能,您应该谨慎只有一个工人保存在特定时间的文件(一个共享文件系统)。因此,包裹在代码如果labindex == 1
被推荐。
因为结果
在整个工人,这个例子采用的是分布式收集
收集数据到工作者1。
一个工人不能绘制可见的身影,所以打印
函数创建的情节查看的文件。
当一个对于
-loop通过分布式范围以连通的作业执行时,每个工人执行其所述环的一部分,从而使工人都同时工作。正因为如此,没有通信工人之间在执行换drange循环允许的。特别是,工人仅需要它的一个codistributed阵列的分区访问。在这样一个循环,需要工人从另一个工人一个codistributed阵列的存取部分的任何计算将产生错误。
为了说明这个特点,你可以试试下面的例子,其中一个for循环的作品,但其他没有。
同SPMD
,创建两个codistributed阵列,一个单位矩阵,另一组到零,在四个工分布。
d =眼(8,8,codistributor())E =零(8,8,codistributor())
默认情况下,这些阵列由列分布;也就是说,每四个工人包含每个阵列的两列。如果您使用的这些阵列换drange
循环,任何计算必须是自包含的每个工人之内。换句话说,你只能执行每个工人中仅限于工人包含阵列的两列计算。
例如,假设你要设置阵列的每列Ë
到阵列的相应列的某一倍数d
:
对于j = drange(1:尺寸(d,2));E(:,j)的= j的* d(:,J);结束
该语句设置Ĵ
第的列Ë
至Ĵ
倍Ĵ
第的列d
。实际上,虽然d
是单位矩阵与1
s下降的主对角线,Ë
有序列1
,2
,3
等,其下跌主对角线。
这工作,因为每个工人有权访问的整列d
和的整列Ë
需要进行的计算中,作为每个工人独立并同时工作在两个八列。
然而,假设你尝试设置的列的值Ë
根据不同的列d
:
对于j = drange(1:尺寸(d,2));E(:,j)的= j的* d(:,J + 1);结束
此方法将失败,因为当Ĵ
是2,你想设置的第二列Ë
使用的第三列d
。这些列被存储在不同的工人,因此发生错误时,指示所述工人之间的通信是不允许的。
要使用换drange
一个codistributed阵列上,必须存在以下条件:
所述codistributed阵列使用1维分布方案(未2dbc
)。
分布符合默认的分区方案。
变量在其上换drange
环是索引提供了用于分发维数组的下标。
所有其它下标可自由选择(并且可以从可采取对于
-loops在整个范围内的每个维度的)。
遍历数组中的所有元素,你可以使用换drange
上分布的尺寸,并定期对于
-loops上的所有其他方面。在下面的示例中执行SPMD
声明4名工人的并行池中运行:
SPMD PP =零(6,8,12, 'codistributed');RR =兰特(6,8,12,codistributor())%默认值分布:%通过第三个维度,均匀地分布在4名工人。对于II = 1:6 JJ = 1:8为KK = drange(1:12)PP(II,JJ,KK)= RR(II,JJ,KK)+ labindex;结束结束结束结束
要查看数组的内容,输入:
PP