文档

使用GOP实现MPI_Allreduce功能

在本例中,我们看共和党功能和建立在其上的功能:gplusgcat。这些看似简单的函数在并行编程中变成了非常强大的工具。

共和党函数允许我们对在所有实验室中定义的变量执行任何关联的二进制操作。这使得我们不仅可以对所有实验室中的变量求和,还可以找到它在所有实验室中的最小值和最大值,并将它们连接起来,并执行许多其他有用的操作。

相关文档:

这个例子中的代码可以在这个函数中找到:

函数paralleltutorial_gop

%#ok<*NOPRT>:禁用代码分析器打印警告

介绍

在进行并行编程时,我们经常会遇到这样的情况:在所有的实验室中都定义了一个变量,我们希望对存在于所有实验室中的变量执行操作。例如,如果我们输入一个spmd语句并定义

spmdx = labindex结束
实验1:x = 1实验室2:x = 2实验室3:x = 3实验室4:x = 4实验室5:x = 5实验室6:x = 6实验室7:x = 7实验室8:x = 8实验室9:x = 9实验室10:x = 10实验室11:x = 11个实验室12:x = 12

在所有的实验中,我们可能想要计算的值的总和x在实验室。这就是gplus运算,它对x在所有的实验室中复制结果:

spmds = gplus (x)公关;结束

在spmd语句中分配的变量在客户机上表示为复合变量。我们可以把实验室的结果值带到客户端,通过索引到复合像细胞阵列:

年代{1}%显示实验1上s的值。所有实验室都存储相同的值。
ans = 78

同时,共和党,gplus,gcat允许我们指定一个函数输出应该返回到的实验室,它们返回其他实验室的空向量。

spmds = gplus(x, 1);结束年代{1}
ans = 78

这个例子展示了如何在所有的实验室中执行一系列类似于加法的操作。在MPI中,这些操作称为集合操作,如MPI_SUM、MPI_PROD、MPI_MIN、MPI_MAX等。

为我们的示例创建输入数据

我们在所有示例中使用的数据非常简单:一个1乘2的变量数组,只比x我们在一开始定义:

spmdx = labindex + (1:2)结束
实验室实验室1:x = 2 3 2: x = 3 4实验室3:x = 4 5实验室4:x = 5 6实验室5:x = 6 7实验室6:x = 7 8实验室7:x = 8 9实验室8:x = 9 10实验室9:x = 10 11实验室10:x = 11 12实验室11:x = 12 13实验室12:x = 13 14

使用GPLUS和GCAT

现在我们已经初始化了向量x对于实验室中的不同值,我们可以问一些问题,例如值的每个元素的和是什么x在实验室吗?那么乘积,最小值和最大值呢?从我们的介绍中,

spmds = gplus (x)公关;结束年代{1}
ans = 90 102

的值的逐个元素的添加x。然而,gplus是唯一的特例吗共和党operation,全局操作的缩写。的共和党函数允许我们在实验室中对变量数组的元素执行任何关联操作。关联运算最基本的例子是加法;它具有联想性是因为加法与所使用的分组无关:

(a + b) + c = a + (b + c)

在MATLAB®中,加法可表示为@plus函数句柄,这样我们也可以写gplus (x)公关作为

spmds = gop(@ +, x);结束年代{1}
ans = 90 102

我们可以串联这个向量x通过使用gcat函数,我们可以选择要连接的维度。

spmdy1 = gcat(x, 1);%沿行连接。y2 = gcat(x, 2);%沿列连接。结束y1 y2 {1} {1}
ans = 2 3 3 4 5 4 5 6 6 7 7 8 9 9 8 10 10 11 11 12 12 13 13 14 ans = 1到13列2 3 3 4 4 5 6 5 6 7 7 8 8列14到24日9 9 10 10 11 11 12 12 13 13 14

GOP的其他基本用途

的值的逐个元素的乘积很容易计算x在实验室:

spmdp = gop(@times, x);结束p {1}
ans = 1.0e+10 * 0.6227 4.3589

我们还可以找到每个元素的最大值x在实验室:

spmdM = gop(@max, x);m = gop(@min, x);结束M {1} {1}
ans = 13 14 ans = 2 3

逻辑运算

MATLAB甚至有更多内置的关联运算。的逻辑和、或和异或操作表示@and,@or,@xor函数处理。例如,看看逻辑数组

spmdy = (x > 4)结束
实验室实验室1:y = 0 0 2: y = 0 0实验室3:y = 0 1实验室4:y = 1 1实验室5:y = 1 1实验室6:y = 1 1实验室7:y = 1 1实验室8:y = 1 1实验室9:y = 1 1实验室10:y = 1 1实验室11:y = 1 1实验室12:y = 1 1

然后,我们可以轻松地对元素执行这些逻辑操作y在实验室:

spmdyand = gop(@and, y);(@or, y);yxor = gop(@xor, y);结束yand了{1}{1}yxor {1}
ans = 0 0 ans = 11 1 ans = 10

按位操作

为了结束MATLAB中内置的关联运算,我们来看一下按位的AND、OR和XOR运算。它们由@bitand,@bitor,@bitxor函数处理。

spmd= gop(@bitand, x);= gop(@bitor, x);xbitxor = gop(@bitxor, x);结束xbitand {1} xbitor {1} xbitxor {1}
这句话的意思是:“ans = 0 0 ans = 15

寻找最小值和最大值的位置

我们需要做一点编程来找到labindex对应于每个元素的最大值x整个实验室都在发生。我们可以做到这在短短几行代码:

类型pctdemo_aux_gop_maxloc
函数[val, loc] = pctdemo_aux_gop_maxloc(inval) %% [val, loc] = pctdemo_aux_gop_maxloc(inval)返回val在所有实验室中inval的最大值%。将这个最大值%所在的labindex返回给loc。{inval, labindex*ones(size(inval))};val = {1};loc = {2};最终函数out = iMaxLoc(in1, in2) %计算最大值及其位置。将它们作为单元格数组返回。(in1{1} >= in2{1});maxVal = in1 {1}; maxVal(~in1Largest) = in2{1}(~in1Largest); maxLoc = in1{2}; maxLoc(~in1Largest) = in2{2}(~in1Largest); out = {maxVal, maxLoc}; end

当函数已经实现,它可以应用,就像任何内置的操作一样容易:

spmd[maxval, maxloc] = pctdemo_aux_gop_maxloc(x);结束maxloc [maxval {1}, {1})
ans = 13 14 12 12

类似地,我们只需要几行代码就可以找到labindex中每个元素的最小值x整个实验室都发生了:

类型pctdemo_aux_gop_minloc
找到一个变量及其labindex的最小值。% [val, loc] = pctdemo_aux_gop_minloc(inval)返回val所有实验室中inval的最小值%。将这个最小值%所在的labindex返回给loc。{inval, labindex*ones(size(inval))});val = {1};loc = {2};end function out = iMinLoc(in1, in2) %计算最小值及其位置。将它们作为单元格数组返回。in1Smallest = (in1{1} < in2{1});minVal = in1 {1}; minVal(~in1Smallest) = in2{1}(~in1Smallest); minLoc = in1{2}; minLoc(~in1Smallest) = in2{2}(~in1Smallest); out = {minVal, minLoc}; end

我们可以很容易地找到最小值共和党:

spmd[minval, minloc] = pctdemo_aux_gop_minloc(x);结束minloc [minval {1}, {1})
ans = 2 3 11 1
这个话题有用吗?