遍历分布式范围(-drange)

注意

用一个对于-loop通过分布式范围(drange)旨在用于codistributed阵列(如内部的的尺寸分布的显式索引SPMD声明或通信作业)。对于涉及平行大多数应用对于-loops你应该首先尝试使用PARFOR循环。看到并行for循环(PARFOR)

并行化for循环

在某些情况下,你已经有了一个粗粒度应用程序来执行,即一个应用,其运行时间比启动和停止程序所需要的通信时间显著更大。如果你不想与界定工作和任务的开销打扰,你可以采取优势的易于使用的是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。在结束时,结果本来是一个变体,并且没有显式调用labSendlabReceive要么g催化剂,就没有办法得到总的结果返回给一个(或全部)的工人。

当使用加载功能,你需要小心的是,数据文件是对所有员工都可以访问,如果必要的。最好的做法是使用显式路径文件的共享文件系统上。

相应地,当使用保存功能,您应该谨慎只有一个工人保存在特定时间的文件(一个共享文件系统)。因此,包裹在代码如果labindex == 1被推荐。

因为结果在整个工人,这个例子采用的是分布式收集收集数据到工作者1。

一个工人不能绘制可见的身影,所以打印函数创建的情节查看的文件。

Codistributed阵列的换drange环

当一个对于-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是单位矩阵与1s下降的主对角线,Ë有序列123等,其下跌主对角线。

这工作,因为每个工人有权访问的整列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