Page 128 - 《软件学报》2025年第5期
P. 128

2028                                                       软件学报  2025  年第  36  卷第  5  期



                                                                             The code of process π 2
                                                                int main(int argc, char* argv[])
                                                                {
                                                                      int x0, RankID, RankSize;
                                 The code of process π 1
                                                                      int myid, size;
                 int main(int argc, char** argv)
                                                                      MPI_Status status;
                 {
                                                                 1    MPI_Comm Comm2nd;
                       int RankID, RankSize, X[2] = {0}, A, B;   2 n
                                                                 2
                       MPI_Status status;                        2 n  MPI_Init(&argc, &argv);
                                                                 3
                       MPI_Comm Comm2nd;                         2 n  MPI_Comm_get_parent(&Comm2nd);
                                                                 4
                       MPI_Comm Comm3rd;                         2 n  MPI_Comm_size(MPI_COMM_WORLD, &RankSize);
                                                                 5
                   1   cin >> X[0] >> X[1];                      2 n  MPI_Comm_rank(MPI_COMM_WORLD, &RankID);
                   1 n                                           6
                  1 n 2  MPI_Init(&argc, &argv);                 2 n  MPI_Recv(&x0, 1, MPI_INT, 0, 1, Comm2nd, &status);
                  1 n 3  MPI_Comm_rank(MPI_COMM_WORLD, &RankSize);  7 2 n  if (x0 > 15) {
                  1 n 4  MPI_Comm_size(MPI_COMM_WORLD, &RankID);  8 2 n     x0 = x0 + 1;  }
                  1 n 5  char Proc2nd_Addr[100] = "..\\..\\..\\MPI_Slave_Rank2nd_Proj\\  9 2 n  if (x0 > 28 && x0 < 30) {
                                                                 10
                              x64\\Release\\MPI_Slave_Rank2nd_Proj.exe";  2 n  x0 = x0 + 1;  }
                                                                 11
                   6
                  1 n  MPI_Comm_spawn(Proc2nd_Addr, MPI_ARGV_NULL, 1,   2 n  MPI_Finalize();
                                                                 12
                              MPI_INFO_NULL, 0, MPI_COMM_SELF,   2 n  return 0; }
                              &Comm2nd, MPI_ERRCODES_IGNORE);
                                                                             The code of process π 3
                  1 n 7  MPI_Send(&X[0], 1, MPI_INT, 0, 1, Comm2nd);
                  1 n 8  char Proc3rd_Addr[100] = "..\\..\\..\\MPI_Slave_Rank3rd_Proj\\  int main(int argc, char* argv[])
                              x64\\Release\\MPI_Slave_Rank3rd_Proj.exe";  {
                   9                                                  int x0, RankID, RankSize;
                  1 n  MPI_Comm_spawn(Proc3rd_Addr, MPI_ARGV_NULL, 1,
                              MPI_INFO_NULL, 0, MPI_COMM_SELF,        int myid, size;
                              &Comm3rd, MPI_ERRCODES_IGNORE);         MPI_Status status;
                  1 n 10  MPI_Send(&X[0], 1, MPI_INT, 0, 1, Comm3rd);  1 3 n  MPI_Comm Comm2nd;
                  11                                              2
                  1 n  if (X[1] > 10) {                          3 n  MPI_Init(&argc, &argv);
                  1 n 12      X[1] = X[1] + 1;                   3 n 3  MPI_Comm_get_parent(&Comm2nd);
                       }                                         3 n 4  MPI_Comm_size(MPI_COMM_WORLD, &RankSize);
                  13                                              5
                  1 n  if (X[1] > 27 && X[1] < 29) {             3 n  MPI_Comm_rank(MPI_COMM_WORLD, &RankID);
                  1 n 14      X[1] = X[1] + 1;                   3 n 6  MPI_Recv(&x0, 1, MPI_INT, 0, 1, Comm2nd, &status);
                       }                                          7   if (x0 < 15) {
                  15                                             3 n
                  1 n  MPI_Finalize();                           3 n 8      x0 = x0 - 1;  }
                  1 n 16  return 0;    }                         3 n 9  if (x0 < 2 && x0 > 0) {
                                                                 10
                                                                 3 n        x0 = x0 - 1;  }
                                                                 11
                                                                 3 n  MPI_Finalize();
                                                                 12   return 0; }
                                                                 3 n
                                                     图 1 MPI 示例程序

                                                                        X  中第   个输入变量. 一个    MPI 程序可以
                                                                              i
                    MPI 程序的测试输入可以表示为           X = {x i |i = 1,2,..., M} , 其中,   x i  是
                                                        j
                 表示为  Π = {π j | j = 1,2,...,N} , 其中,   π j  表示   Π 中第   个进程,   N  表示进程数.
                    ● 节点. 进程  π j  中基本执行的单元称为节点, 通常对应于一或若干顺序执行的语句、一个循环或判断条件语
                                                                 l
                                                                                  l
                                                                        l
                 句、一个通信原语. 这里, 我们将一个位于           π j  内的节点表示为   n  , 其中,    表示  π j  内第   个节点.
                                                                 j
                                    X  执行一个
                    ● 路径. 以测试输入               MPI 程序  Π 时,   X  遍历进程  π j  中的节点组成一条子路径, 记为     p j (X) .   p j (X)
                                                                       Π 中的一条完整路径由每一进程内遍历子
                 中包含的节点数, 称为       p j (X) 的子路径长度, 记为  |p j (X)| . 此时,    X  执行
                                                                             ∗   ∗                 ∗   P ∗
                 路径组成, 记为    P(X) = {p j (X)| j = 1, 2,..., N} . 此外, 一条目标路径被表示为   P = {p |j = 1,2,...,N}  , 其中,   p  为
                                                                                                    j
                                                                                 j
                     j 条目标子路径. 文献     [4] 中, 通过公式                   ∗           p j (X) 的相似度. 注意, 这里也将
                 中第                                (1) 计算目标子路径     p  与遍历子路径
                                                                    j
                     ∗                ∗
                 Sim(p , p j (X)) 称为   X  面向  p  的覆盖程度.
                                      j
                     j

                                                                ∗
                                                              |p ∩ p j (X)|
                                                                j
                                                     ∗
                                                Sim(p , p j (X)) =                                    (1)
                                                     j
                                                                  ∗
                                                             max{|p |,|p j (X)|}
                                                                  j
                                                                                          ∗
                       ∗
                                                 ∗
                                                                               ∗
                 其中,   |p ∩ p j (X)| 是从第  1  个节点开始,    p  和  p j (X) 连续相同节点的数量.   max{|p |,|p j (X)|} 为   p  和  p j (X) 长度的最
                       j                         j                             j          j
   123   124   125   126   127   128   129   130   131   132   133