gpt4 book ai didi

c - MPI 类型匹配

转载 作者:太空狗 更新时间:2023-10-29 15:36:32 27 4
gpt4 key购买 nike

我想知道为什么这个程序实际上可以在 MPI (openMPI 1.5/1.6.) 中运行

#include <stdio.h>
#include <mpi.h>

#define VECTOR_SIZE 100

int main(int argc,char ** argv) {
int A[VECTOR_SIZE];
int sub_size=2;
int count=10;
MPI_Datatype partial_array;
int rank,size;
MPI_Status status;

MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);

MPI_Type_vector(count, sub_size,
2*sub_size, MPI_INT, &partial_array);

MPI_Type_commit(&partial_array);

if (rank == 0) {
int i;
// server - initialize data and send
for (i = 0; i< VECTOR_SIZE; i++) {
A[i] = i;
}
MPI_Send(&(A[0]), 1, partial_array, 1, 0, MPI_COMM_WORLD);
} else if (rank==1) {
int i;
for (i = 0; i< VECTOR_SIZE; i++) {

A[i] = 0;

}
// vector is composed by 20 MPI_INT elements
MPI_Recv(&(A[0]),20, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);

printf("\n");

for (i = 0; i<VECTOR_SIZE; i++) {
printf("%d ",A[i]);

}
printf("\n");
}

MPI_Finalize();

}

而交换发送和接收原语的其他程序不会终止(接收永远不会完成):

#include <stdio.h>
#include <mpi.h>

#define VECTOR_SIZE 100

int main(int argc,char ** argv) {
int A[VECTOR_SIZE];
int sub_size=2;
int count=10;
MPI_Datatype partial_array;
int rank,size;
MPI_Status status;

MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);

MPI_Type_vector(count, sub_size,
2*sub_size, MPI_INT, &partial_array);

MPI_Type_commit(&partial_array);

if (rank == 0) {
int i;
// server - initialize data and send
for (i = 0; i< VECTOR_SIZE; i++) {

A[i] = i;

}
MPI_Send(&(A[0]),20, MPI_INT, 0, 0, MPI_COMM_WORLD);

} else if (rank==1) {
int i;
// client - receive data and print
for (i = 0; i< VECTOR_SIZE; i++) {

A[i] = 0;

}

MPI_Recv(&(A[0]), 1, partial_array, 1, 0, MPI_COMM_WORLD, &status);

printf("\n");

for (i = 0; i<VECTOR_SIZE; i++) {
printf("%d ",A[i]);

}
printf("\n");
}

MPI_Finalize();

}

如果我正确理解 MPI 类型的数学规则,则两者都不会完成。

最佳答案

显然在第二个程序中,rank 0 正在向自己发送消息,而 rank 1 也期待来自自己的消息:

MPI_Send(&(A[0]),20, MPI_INT, 0, 0, MPI_COMM_WORLD);

目标排名应该是 1,而不是 0

MPI_Recv(&(A[0]), 1, partial_array, 1, 0, MPI_COMM_WORLD, &status);

源排名应该是 0,而不是 1。

否则你没有理解正确的MPI类型匹配。它只声明两端的类型映射中的基础原始类型应该匹配。您正在创建一个 vector ,其类型映射具有 20 个原始整数。如果您发送一个这种类型的元素,您的消息实际上将包含 20 个整数。在接收端,您至少提供了 20 个整数的空间,所以这是正确的。反之亦然。

如果您在第二个程序中仅发送 10 或 18 个整数是不正确的,因为它们不会构成 vector 类型的完整元素。然而,接收操作将完成,但如果您在状态上调用 MPI_Get_count(),则返回 MPI_UNDEFINED,因为从接收到的原始整数元素的数量无法构造整数 vector 元素的数量。混合原始类型也是不正确的,例如发送 MPI_DOUBLE(或 vector 、结构或任何其他具有 double 的类型)并将其作为 MPI_INT 接收。

另请注意,MPI 消息不携带它们的类型映射或类型 ID,因此大多数 MPI 实现不检查类型是否匹配。 可能发送 MPI_FLOAT 并将其接收为 MPI_INT(因为在大多数系统上两者都是 4 字节)但它是不正确的 这样做。

关于c - MPI 类型匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10664765/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com