非分布式与分布式数组
简介
MATLAB® 软件支持的许多内置数据类型和数据结构在 MATLAB 并行计算环境中也得到支持。这包括包含数值、字符、逻辑值、元胞或结构体的任意维数的数组。除了这些基本构建块之外,MATLAB 并行计算环境还提供不同类型的数组。
非分布式数组
当您创建一个非分布式数组时,MATLAB 会在每个工作单元的工作区中构建一个单独的数组,并在所有工作单元上使用相同的变量名。对该变量执行的任何操作都会影响分配给它的所有单独数组。如果从工作单元 1 显示分配给此变量的值,则所有工作单元都会通过显示位于其工作区中的该名称的数组来响应。
非分布式数组的状态取决于每个工作单元工作区中该数组的值:
复制的数组
复制的数组驻留在所有工作单元的工作区中,并且其大小和内容在所有工作单元上都是相同的。当您创建数组时,MATLAB 会将其分配给所有工作单元上的相同变量。如果在 spmd 中显示分配给该变量的值,则所有工作单元都会通过显示相同的数组来响应。
spmd, A = magic(3), end
WORKER 1 WORKER 2 WORKER 3 WORKER 4
| | |
8 1 6 | 8 1 6 | 8 1 6 | 8 1 6
3 5 7 | 3 5 7 | 3 5 7 | 3 5 7
4 9 2 | 4 9 2 | 4 9 2 | 4 9 2变体数组
变体数组也驻留在所有工作单元的工作区中,但是其内容在一个或多个工作单元上有所不同。当您创建数组时,MATLAB 会为所有工作单元上的相同变量分配不同的值。如果显示分配给此变量的值,所有工作单元都会通过显示它们的数组版本来响应。
spmd, A = magic(3) + spmdIndex - 1, end
WORKER 1 WORKER 2 WORKER 3 WORKER 4
| | |
8 1 6 | 9 2 7 | 10 3 8 | 11 4 9
3 5 7 | 4 6 9 | 5 7 9 | 6 8 10
4 9 2 | 5 10 3 | 6 11 4 | 7 12 5当复制数组的值在每个工作单元上都变得唯一时,复制数组就可以变为变体数组。
spmd
B = magic(3); %replicated on all workers
B = B + spmdIndex; %now a variant array, different on each worker
end私有数组
在一个或多个(但不是全部)工作单元上定义了一个私有数组。您可以在条件语句中使用 spmdIndex 来创建此数组,如下所示:
spmd
if spmdIndex >= 3, A = magic(3) + spmdIndex - 1, end
end
WORKER 1 WORKER 2 WORKER 3 WORKER 4
| | |
A is | A is | 10 3 8 | 11 4 9
undefined | undefined | 5 7 9 | 6 8 10
| 6 11 4 | 7 12 5共存分布式数组
对于复制和变体数组,数组的完整内容存储在每个工作单元的工作区中。另一方面,共存分布式数组被划分为多个段,每个段驻留在不同工作单元的工作区中。每个工作单元都有自己的数组段可供使用。减少每个工作单元必须存储和处理的数组的大小意味着更有效地利用内存和更快的处理,特别是对于大型数据集。
此示例将 3×10 的复制数组 A 分布到四个工作单元中。得到的数组 D 的大小也是 3×10,但每个工作单元上仅驻留了整个数组的一部分。
spmd
A = [11:20; 21:30; 31:40];
D = codistributed(A);
getLocalPart(D)
end
WORKER 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有关使用共存分布式数组的更多详细信息,请参阅 使用共存分布式数组。