int MPI_Send(const void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)
OpenMPI 将发送从 buf 开始的连续字节 count * sizeof(datatype) 以允许发送诸如 int 数组之类的内容。例如,如果你声明一个 10 int 数组int arr[10],你可以用
MPI_Send(arr, 10, MPI_INT, 1, 0, MPI_COMM_WORLD);
并以类似方式接收。由于buf 是一个空指针,我们可以通过发送sizeof(my_struct) 字节并在接收端作为结构回退来滥用它来发送结构。这是一个例子:
#include "mpi.h"
#include <stdio.h>
typedef struct
{
char a;
int b;
short c;
} my_struct;
int main (int argc, char *argv[])
{
int numtasks, taskid;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &taskid);
MPI_Comm_size(MPI_COMM_WORLD, &numtasks);
if (taskid == 0)
{
my_struct m;
m.a = '!';
m.b = 1234;
m.c = 5678;
MPI_Send(&m, sizeof(my_struct), MPI_CHAR, 1, 0, MPI_COMM_WORLD);
}
else
{
my_struct m;
MPI_Recv(&m, sizeof(my_struct), MPI_CHAR, 0, 0, MPI_COMM_WORLD,
MPI_STATUS_IGNORE);
printf("%c %d %d\n", m.a, m.b, m.c);
}
MPI_Finalize();
}
由于 C 数组连续存储数据,我们甚至可以像 malloc an array of structs 那样发送结构数组。因此,如果您有 my_struct m_array[10],您将发送(并以类似方式接收)
MPI_Send(m_array, sizeof(my_struct) * 10, MPI_CHAR, 1, 0, MPI_COMM_WORLD);