与Codistributed阵列工作

怎么样MATLAB软件分发数组

当您分发一个数组来了一些工人,MATLAB®软件分区阵列到阵列的每个工人的段和分配一个段。可以通过分配的行水平地划分一个二维阵列,分配所述原始阵列的列的不同的工人,或垂直。具有N维的阵列可以沿着它的任何N维的被分配。您可以选择该阵列的尺寸是由数组构造命令指定它进行分区。

例如,一个80-通过-1000阵列分发到四名工人,则可以通过列任一分区它,使每个工人80通过-250段或按行,每个工人得到一个20×1000段。如果阵列尺寸不均分了工人的数量,尽可能均匀MATLAB分区它。

下面的示例创建一个80通过-1000复制阵列,并将其分配给变量一个。在这样做时,每个工人在创建其自己的工作区的相同阵列,并将其分配给变量一个,其中一个是局部的工人。第二命令分配一个,创建单个80-通过-1000阵列d跨越所有四个工人。工作者1个存储列1至250,工人2个存储列251〜500,依此类推。的默认分配是由最后nonsingleton尺寸,因此,在这种情况下,2维阵列的列。

SPMD中A =零(80,1000);d = codistributed(A)结束实验1:本实验商店d(:,1:250)。实验2:本实验商店d(:,251:500)。实验3:本实验商店d(:,501:750)。实验4:本实验商店d(:,751:1000)。

每个工人能够访问该阵列的所有段。访问本地段比到远程段更快,因为后者需要工人之间发送和接收数据,因此需要更多的时间。

怎么样MATLAB显示一个Codistributed阵列

每个工人,在MATLAB并行命令窗口显示有关codistributed阵列,本地部分,和codistributor信息。例如,一个8×8的单位矩阵codistributed之间四名工人,对每个工人两列,显示这样的:

>> SPMD( 'codistributed' 8)结束实验1 II =眼:此实验商店II(:,1:2)。LocalPart依照:[8X2双] Codistributor:[1x1的codistributor1d]实验2:本实验商店II(:,3:4)。LocalPart依照:[8X2双] Codistributor:[1x1的codistributor1d]实验3:此实验商店II(:,5:6)。LocalPart依照:[8X2双] Codistributor:[1x1的codistributor1d]实验4:本实验商店II(:,7:8)。LocalPart依照:[8X2双] Codistributor:[1x1的codistributor1d]

若要查看阵列的本地网段的实际数据,使用getLocalPart功能。

有多少是分配给每个工人

在分配的阵列ñ行,如果ñ是工人数整除,MATLAB存储相同的行数(N / numlabs)对每个工人。当这个数字是不是由工人数整除,MATLAB分割阵列尽可能均匀。

MATLAB提供了一个名为codistributor对象属性尺寸划分你可以用它来确定数组的确切分布。看到索引到一个数组Codistributed对索引与codistributed阵列的更多信息。

其他数据类型的分布

您可以分发的内置数据类型的任何MATLAB的阵列,也数值数组,其复杂的或稀疏,但不是函数处理或对象类型的数组。

创建Codistributed阵列

您可以在任何的以下方式codistributed阵列:

  • 分区更大的阵列- 开始一个大阵是全体职工复制和分区它,这样的作品跨越工人分布。当你有足够的内存来存储初始复制的阵列,这是最有用的。

  • 从较小的阵列构建- 启动具有较小的变体或储存在每个工人复制阵列,并且将它们结合,从而每个阵列变得更大codistributed阵列的段。这种方法,因为它可以让你从更小的碎片打造codistributed阵列减少了内存的需求。

  • 使用MATLAB构造函数- 使用任何像MATLAB构造函数兰特要么用codistributor对象参数。这些功能提供了构建任何大小的阵列codistributed只需一个步骤的快速手段。

分区更大的阵列

如果你有一个大阵已经在内存中,你更迅速地想MATLAB来处理,可以将其划分成更小的片段和这些片段分发到所有使用工人codistributed功能。每个工人然后有一个数组,它是一小部分的原稿的尺寸,从而减少访问是本地的每个工人的数据所需的时间。

作为一个简单的例子,下面的代码行创建分配给变量每个工人一个4×8矩阵复制一个

SPMD,A = [11:18;21:28;31:38;41:48],结束A = 11 12 13 14 15 16 17 18 21 22 23 24 25 26 27 28 31 32 33 34 35 36 37 38 41 42 43 44 45 46 47 48

下一行使用的codistributed功能构建单个4×8矩阵d其沿所述阵列的所述第二维分布:

SPMD d = codistributed(A);getLocalPart(d)结束1:本地部分|2:本地部分|3:本地部分|4:本地部分11 12 |13 14 |15 16 |17 18 21 22 |23 24 |25 26 | 27 28 31 32 | 33 34 | 35 36 | 37 38 41 42 | 43 44 | 45 46 | 47 48

数组一个d具有相同的尺寸(4×8)。排列一个存在于它的上每个工人全尺寸,而只有阵列的段d存在于每个工人。

SPMD,尺寸(A),尺寸(d),端

检查变量在客户工作区,即工人中codistributed内部的阵列SPMD语句,是从客户端外部的角度分布阵列SPMD声明。未在SPMD内codistributed变量,是在SPMD以外的客户端复合材料。

卫生组织名称大小字节A类1×4 613复合d 4×8 649分布

查看codistributed功能参考页语法和用法信息。

从较小的阵列构建

codistributed功能是减少的存储器时,第一构造全阵列中的一个工作区,然后将其分割成分布式段所需的存储数据量不太有用。为了节省内存,可以构建在每个工人的小片(地方部分),然后再使用codistributed.build将它们组合成跨工人分布在单个阵列。

本示例创建每个四名工人,然后使用的4×250的变体数组Acodistributor跨四名工人分配这些段,从而形成4×1000 codistributed阵列。下面是变量数组,一个

SPMD A = [1:250;251:500;501:750;751:1000] + 250 *(labindex  -  1);端工作者1个WORKER 2 WORKER 3 1 2 ... 250 |251 252 ... 500 |501 502 750 ... |等251 252 ... 500 |501 502 750 ... |751 752 ... 1000 | etc. 501 502 ... 750 | 751 752 ...1000 | 1001 1002 ...1250 | etc. 751 752 ...1000 | 1001 1002 ...1250 | 1251 1252 ...1500 | etc. | | |

现在这些片段组合成由所述第一维度(行)分布的阵列。阵列现在是16×250,与驻留在每个工人一个4乘250段:

SPMD d = codistributed.build(A,codistributor1d(1,[4 4 4 4],[16 250]))结束实验1:本实验商店d(1:4,:)。LocalPart依照:[4x250双] Codistributor:[1x1的codistributor1d]卫生组织名称大小字节A类1×4 613复合d 16x250 649分布

你也可以使用复制的阵列以同样的方式,如果你想创建一个codistributed阵列,它的片段都是相同的开始。查看codistributed功能参考页语法和用法信息。

运用MATLAB构造函数

MATLAB提供了几个数组构造函数,您可以用它来构建特定值,大小和类别的codistributed阵列。这些函数以相同的方式如在MATLAB语言他们的非分布式的对应操作,不同之处在于它们使用指定codistributor对象分布在整个工所得阵列,codist

构造函数。该codistributed构造函数列在这里。使用codist参数(由所创建的codistributor功能:codist = codistributor())来指定在哪个维度阵列来分发。查看这些功能进行进一步的语法和用法信息的各个参考页。

(___,codist)(___,codist)天道酬勤(___,codist)为NaN(___,codist)那些(___,codist)兰特(___,codist)兰迪(___,codist)randn(___,codist)真正(___,codist)(___,codist)codistributed.cell(M,N,...,codist)codistributed.colon(A,d,b)中codistributed。linspace(M,N,...,codist)codistributed。LOGSPACE(M,N,...,codist)(M,N,codist)codistributed.speye(M,...,codist)codistributed.sprand(M,N,密度,codist)codistributed.sprandn(M,N,密度,codist)

局部数组

一个codistributed阵列驻留在每个工人是一块更大的阵列的那一部分。每个工人可以工作在自己的普通阵列的部分,也可以使该段的副本变体或自己的私人阵列。这个地方一个codistributed阵列段的副本被称为本地数组

从Codistributed阵列创建本地阵列

getLocalPart功能拷贝codistributed阵列的一个单独的变量数组的段。这个例子使一个本地副本大号codistributed阵列的每个段的d。的大小大号显示,它仅包含的本地部分d每个工人。假设你在四个工作人员分发的数组:

SPMD(4)A = [1:80;81:160;161:240];d = codistributed(A);尺寸(d)L = getLocalPart(d);尺寸(L)端

返回上每个工人:

3 80 3 20

每个工人认识到codistributed阵列d是3×80。但是,请注意,本地部分的大小,大号,是3×20上每个工人,因为80列d分布在四处打工。

创建从本地阵列一个Codistributed

使用codistributed.build函数来执行相反的操作。该功能,在所描述从较小的阵列构建,结合了本地变体阵列为沿规定尺寸分布的单个阵列。

继续前面的例子,拿地方变长数组大号并把它们放在一起作为段建立一个新的codistributed阵列X

SPMD codist = codistributor1d(2,[20 20 20 20],[3 80]);X = codistributed.build(L,codist);大小(X)端

返回上每个工人:

3 80

获取信息有关阵列

MATLAB提供了多种功能,提供了任何特定的阵列上的信息。除了这些标准的功能,也有两个函数仅是可用于与codistributed阵列。

判断一个数组Codistributed

iscodistributed函数返回一个逻辑1真正)如果输入阵列codistributed和逻辑0) 除此以外。语法

SPMD,TF = iscodistributed(d),端

哪里d是任何MATLAB阵列。

确定分配的尺寸

所述codistributor对象确定阵列如何分割及其分布的尺寸。要访问的数组的codistributor,使用getCodistributor功能。这将返回两个属性,尺寸划分

SPMD,getCodistributor(X),结束尺寸:2分区:[20 20 20 20]

尺寸的价值2装置阵列X通过柱(尺寸2)分布;和划分的价值[20 20 20 20]手段有二十列驻留在四个工人。

编程获取这些属性,返回的输出getCodistributor给一个变量,然后用点符号来访问每个属性:

SPMD C = getCodistributor(X);部= C.Partition昏暗= C.Dimension端

其他阵列功能

提供有关标准阵列的信息等功能也工作在codistributed阵列和使用相同的语法。

  • 长度- 返回一个特定的尺寸的长度。

  • 为ndims- 返回维数。

  • numel- 返回数组中元素的数目。

  • 尺寸- 返回每个维度的大小。

  • 是*- 有名称开头的许多功能“是”, 如ischarissparse

改变分配的尺寸

当构建一个数组,你分配阵列的部分沿阵列的尺寸之一。可以使用改变该分布的方向现有阵列上重新分配与不同的对象codistributor功能。

构造一个8×16阵列codistributedd由列四个工人分布的随机值:

SPMD d =兰特(8,16,codistributor());大小(getLocalPart(d))端

返回上每个工人:

8 4

从创建已被列分配现有的按行分配一个新的codistributed数组:

SPMD X =重分发(d,codistributor1d(1));大小(getLocalPart(X))端

返回上每个工人:

2月16日

还原整个阵列

您可以使用一个codistributed阵列恢复到其未分配形式收集功能。收集带有一个数组的各段驻留在不同的工人并将它们组合成上所有工人复制的阵列,或插入一个工人的单个阵列。

分发4×10阵列沿着第二维度四名工人:

SPMD,A = [11:20;21:30;31:40;41:50],结束A = 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 SPMD,d = codistributed(A),端工作者1个WORKER 2 WORKER 3 WORKER 4 11 12 13 |14 15 16 |17 18 |19 20 21 22 23 |24 25 26 |27 28 | 29 30 31 32 33 | 34 35 36 | 37 38 | 39 40 41 42 43 | 44 45 46 | 47 48 | 49 50 | | | spmd, size(getLocalPart(D)), end Lab 1: 4 3 Lab 2: 4 3 Lab 3: 4 2 Lab 4: 4 2

通过收集段恢复未分配段到全阵列形式:

SPMD,X =收集(d),端X = 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 4849 50 SPMD,尺寸(X),端部4 10

索引到一个数组Codistributed

而索引到一个非分布式阵列是相当简单的,codistributed阵列需要额外考虑。一个非分布式阵列的每一维的范围内1索引到最终标,这是在MATLAB所代表结束关键词。任何尺寸的长度可以使用可以容易地确定任一尺寸要么长度功能。

与codistributed阵列,不那么容易地获得这些值。例如,一个阵列的所述第二部分(即驻留在工人2的工作区中)具有依赖于所述阵列分布的起始索引。对于一个200通过-1000阵列与由列在四个工缺省分配,对工人2的起始索引是251对于1000逐200阵列还通过列分布,即相同的索引将是51.对于结束索引,这是不使用给定的结束关键字,如结束在这种情况下指的是整个阵列的结尾;也就是说,最终段的最后一个下标。每个段的长度也没有通过使用给定的长度要么尺寸的功能,因为它们只返回整个阵列的长度。

在MATLAB结肠运营商和结束关键字是两个索引到非分布式阵列的基本工具。对于codistributed阵列,MATLAB提供了一个版本的结肠运营商,称为codistributed.colon。这实际上是一个功能,而不是一个象征性的运营商像结肠

注意

当使用数组索引codistributed数组,你只能使用复制或codistributed数组索引。该工具箱不检查,以确保索引被复制,因为这将需要全球通信。因此,使用不支持的变体(如万博1manbetxlabindex)索引到codistributed阵列可能会产生意想不到的效果。

例如:在Codistributed阵列查找特定元素

假设你有100万组的元素的行向量,几个工人之间的分配,并要找到它的元素号225000。也就是说,你想知道什么工人包含此元素,并在对工人的矢量当地部分什么位置。该globalIndices函数提供codistributed阵列的局部和全局索引之间的相关性。

d =兰特(1,1e6, '分布式');%的SPMD globalInd = globalIndices(d,2)列分布式;POS =查找(globalInd == 225e3);如果〜的isEmpty(POS)fprintf中(... '元素是在位置%d对工人%d \ n',POS,labindex);年底结束

如果您对四名工人池运行这段代码将得到如下结果:

实验1:元素是225000位上的工人1。

如果您在五个劳池运行这段代码将得到如下结果:

实验2:元素在25000位置对工人2。

请注意,如果你使用不同大小的游泳池,该元素在不同的工人不同的位置结束了,但同样的代码可以用来定位元素。

2维分布

作为替代通过行或列的一维分布,则可以使用通过分配块的矩阵'2dbc'或二维块环状分布。而不是包括多个完整的行或矩阵的列的段,所述codistributed阵列的段是2维正方形块。

例如,考虑一个简单的8×8矩阵元素递增值。您可以创建此数组中的SPMD声明或通信工作。

SPMD A =重塑(1:64,8,8)端

其结果是复制的数组:

1 9 17 25 33 41 49 57 2 10 18 26 34 42 50 58 3 11 19 27 35 43 51 59 4 12 20 28 36 44 52 60 5 13 21 29 37 45 53 61 6 14 22 30 38 46 54 62 7 1523 31 39 47 55 63 8 16 24 32 40 48 56 64

假设你要分配在四个工人这个数组,具有4×4块作为每个工人的本地部分。在这种情况下,实验室网格是工人的一个2×2排列和块大小是在一侧有四个元素的平方(即,每个块是4乘4平方)。有了这些信息,你可以定义codistributor对象:

SPMD DIST = codistributor2dbc([2 2],4);结束

现在你可以使用这个codistributor对象分发原矩阵:

SPMD AA = codistributed(A,DIST)端

这种分配根据该方案在工人中的数组:

如果实验室网格不完全重叠codistributed阵列的尺寸,你仍然可以使用'2dbc'分布,这是块循环。在这种情况下,你可以想像实验室电网正在两个维度叠加反复,直到所有的原始矩阵元素都包括在内。

使用相同的原始的8×8矩阵和2×2网格实验室,考虑的3而不是4的块大小,以使得3×3的正方形块被工人之间分配。代码如下所示:

SPMD DIST = codistributor2dbc([2 2],3)AA = codistributed(A,DIST)端

实验室网格的第一个“行”被分配给工人1和工人2,但只包含六个原始矩阵的八列。因此,接下来的两列被分配到工人1.这个过程一直持续,直到第一行中的所有列分布。然后,一个类似的过程适用于行,你继续向下矩阵,如下面的分配方案:

上面显示的图,需要实验室网格的4所覆盖,以适应整个原始矩阵的方案。下面的代码显示数据的每个工人的所得分布。

SPMD getLocalPart(AA)端
实验1:ANS = 1 9 17 49 57 2 10 18 50 58 3 11 19 51 59 7 15 23 55 63 8 16 24 56 64实验2:ANS = 25 33 41 26 34 42 27 35 43 31 39 47 32 40 48实验3:ANS = 4 12 20 52 60 5 13 21 53 61 6 14 22 54 62实验4:ANS = 28 36 44 29 37 45 30 38 46

以下几点值得注意:

  • '2dbc'除非块的大小至少是几十分布可能不提供任何性能增强。默认的块大小为64。

  • 该实验室电网应尽量接近正方形越好。

  • 不是所有的功能得到加强,工作的功能'1D'codistributed阵列上工作'2dbc'codistributed阵列。