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