使用GOP实现MPI_ALLREDUCE功能
在此示例中,我们查看共和党
功能及其构建的功能:gplus
和GCAT
。这些看似简单的功能原来是并行编程中非常强大的工具。
这共和党
函数允许我们在所有实验室定义的变量上执行任何关联二进制操作。这不仅使我们不仅可以在所有实验室中汇总一个变量,而且还可以在实验室中找到其最小和最大值,使其加以串通,并执行许多其他有用的操作。
相关文档:
SPMD
在平行计算工具箱™用户指南中
本示例中显示的代码可以在此功能中找到:
功能PORALLELTUTIOL_GOP
介绍
进行并行编程时,我们经常会遇到所有实验室定义变量的情况,并且我们希望在变量上存在所有实验室上的操作。例如,如果我们输入SPMD语句并定义
SPMDx = labindex;结尾
在所有实验室中,我们可能要计算X
跨实验室。这正是gplus
操作确实,它总结了X
在整个实验室中,重复所有实验室的结果:
SPMDs = gplus(x);结尾
分配给SPMD语句内部的变量在客户端上表示为复合。我们可以像单元格数组一样将实验室的结果值从实验室带到客户端:
s {1}%在实验室1上显示s的值。所有实验室都存储相同的值。
ANS = 78
还,共和党
,,,,gplus
, 和GCAT
允许我们指定应返回函数输出的单个实验室,并在其他实验室返回一个空的向量。
SPMDs = gplus(x,1);结尾s {1}
ANS = 78
此示例显示了如何执行类似于所有实验室的添加的操作主机。在MPI中,这些被称为集体操作,例如mpi_sum,mpi_prod,mpi_min,mpi_max等。
为我们的示例创建输入数据
我们为所有示例使用的数据非常简单:一个1 by-2变体数组,仅比该阵列复杂得多X
我们在一开始就定义了:
SPMDx = labindex +(1:2)结尾
使用GPLUS和GCAT
现在我们已经初始化了我们的向量X
对于实验室上的不同值,我们可以提出问题,例如什么是元素的元素总和X
跨实验室?产品,最小值和最大值呢?从我们的介绍中可以期待
SPMDs = gplus(x);结尾s {1}
ANS = 90 102
返回逐元元素的添加值X
。然而,gplus
只是一个特殊情况共和党
操作,全球操作缩写。这共和党
功能使我们能够在变体数组的元素上执行整个实验室的任何关联操作。关联操作的最基本示例是加法。它具有关联性,因为添加与使用的分组无关:
(a + b) + c = a +(b + c)
在Matlab®中,可以用@加
函数句柄,所以我们也可以写gplus(x)
作为
SPMDs = gop(@plus,x);结尾s {1}
ANS = 90 102
我们可以加入矢量X
通过使用GCAT
功能,我们可以选择限制的维度。
SPMDy1 = gcat(x,1);%沿行的串联。y2 = gcat(x,2);%沿列的联合。结尾y1 {1} y2 {1}
Ans = 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 13 14 Ans =列1至13 2 3 3 4 4 4 5 6 6 6 7 7 8 8 8列14至24 99 10 10 11 11 12 12 13 13 14
共和党的其他基本用途
计算值的值的元素元素很简单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} m {1}
ans = 13 14 ans = 2 3
逻辑操作
MATLAB具有更多内置的关联操作。逻辑和或XOR操作由@和
,,,,@或者
, 和@xor
功能处理。例如,查看逻辑数组
SPMDy =(x> 4)结尾
然后,我们可以轻松地在y
在整个实验室中:
SPMDyand = gop(@and,y);yor = gop(@or,y);yxor = gop(@xor,y);结尾yand {1} yor {1} yxor {1}
ans = 1×2逻辑数组0 0 ans = 1×2逻辑数组1 1 ans = 1×2逻辑数组1 0
钻头操作
为了结束我们对MATLAB内置的关联操作的参观,我们查看了位和或XOR操作。这些由@bitand
,,,,@bitor
, 和@bitxor
功能处理。
SPMDxbitand = gop(@bitand,x);Xbitor = GOP(@bitor,x);xbitxor = gop(@bitxor,x);结尾xbitand {1} xbitor {1} xbitxor {1}
ans = 0 0 ans = 15 15 ans = 0 12
查找最小和最大的位置
我们只需要做一点编程即可找到对应于最大元素最大元素的位置的LabIndexX
整个实验室发生。我们只需几行代码即可完成此操作:
类型pctdemo_aux_gop_maxloc
函数[val,loc] = pctdemo_aux_gop_maxloc(inval)%pctdemo_aux_gop_maxloc查找变体及其labindex的最大值。%[val,loc] = pctdemo_aux_gop_maxloc(Inval)返回所有实验室中Inval的最大值%。该最大值%所在的LabIndex返回到LOC。%版权所有2007 The MathWorks,Inc。OUT = GOP(@ImaxLoc,{Inval,LabIndex*ons(size(inval))});val = out {1};loc = out {2};end函数out = imaxloc(in1,in2)%计算最大值及其位置。将它们作为单元阵列返回。in1largest =(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);结尾[maxval {1},maxloc {1}]
ANS = 13 14 12 12
同样,我们只需要几行代码即可找到LabIndexX
整个实验室发生:
类型pctdemo_aux_gop_minloc
函数[val,loc] = pctdemo_aux_gop_minloc(inval)%pctdemo_aux_gop_minloc查找变体及其labindex的最小值。%[val,loc] = pctdemo_aux_gop_minloc(Inval)在所有实验室中返回val的最小值%。该最小值%所在的LabIndex将返回到LOC。%版权所有2007 The MathWorks,Inc。OUT = GOP(@IminLoc,{Inval,LabIndex*ons(size(inval))});val = out {1};loc = out {2};端功能熄灭= iminloc(in1,in2)%计算最小值及其位置。将它们作为单元阵列返回。in1smallest =(in1 {1}
然后,我们可以轻松找到最低限度共和党
:
SPMD[Minval,MinLoc] = PCTDEMO_AUX_GOP_MINLOC(X);结尾[Minval {1},MinLoc {1}]
ans = 2 3 1 1