gpt4 book ai didi

c - 如何干预 MPI_Gather

转载 作者:太空宇宙 更新时间:2023-11-04 03:29:42 27 4
gpt4 key购买 nike

我有两个 MPI 进程。每个进程都有一个相同大小的数组。我想将两个数组合并为一个双倍大小的数组。我应该使用哪个 mpi 接口(interface)?

例如,我有两个数组:

enter image description here

我想让他们进入排名 0:

enter image description here

我试过 MPI_Gather

MPI_Gather(
arr, // void* send_data,
4, // int send_count,
MPI_INT, // MPI_Datatype send_datatype,
arr_merged, // void* recv_data,
1, // int recv_count,
MPI_INT, // MPI_Datatype recv_datatype,
0, // int root,
MPI_COMM_WORLD); // MPI_Comm communicator

但是我得到了错误

enter image description here

最佳答案

您上面的代码在计数方面不正确。除非您正在使用派生类型,否则 sendcount 和 recvcount 应该相同(在本例中为 4)。然而,这将导致顺序:0 2 4 6 1 3 5 7,即两条消息一个接一个地收到。

您可以通过定义 vector 类型接收跨步模式。但是,为了接收到正确的位置,您需要使用 MPI_Gatherv 为每个发送方指定不同的位移 - 您还需要调整 vector 类型的大小,因为默认范围没有用。

附加代码似乎工作正常,其中第一行输出使用通常的 gather,但第二行在接收端使用 gatherv 和 vector 数据类型。不幸的是,看不到更简单的方法...

user$ mpicc -o mpigather mpigather.c
user$ mpiexec -n 2 ./mpigather
0 2 4 6 1 3 5 7
0 1 2 3 4 5 6 7
user$ mpiexec -n 3 ./mpigather
0 3 6 9 1 4 7 10 2 5 8 11
0 1 2 3 4 5 6 7 8 9 10 11

代码如下:

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

#define NBUFF 4

void main(void)
{
int i;
MPI_Comm comm = MPI_COMM_WORLD;
MPI_Datatype vector, resizevector;
int rank, size;

MPI_Init(NULL, NULL);
MPI_Comm_rank(comm, &rank);
MPI_Comm_size(comm, &size);

int sendbuff[NBUFF];
int recvbuff[size*NBUFF];

for (i=0; i < NBUFF; i++)
{
sendbuff[i] = rank+i*size;
}

for (i=0; i < NBUFF*size; i++)
{
recvbuff[i] = -1;
}

MPI_Gather(sendbuff, NBUFF, MPI_INT, recvbuff, NBUFF, MPI_INT, 0, comm);

if (rank == 0)
{
for(i=0; i < NBUFF*size; i++)
{
printf("%d ", recvbuff[i]);
}
printf("\n");
}

MPI_Type_vector(NBUFF, 1, size, MPI_INT, &vector);
MPI_Type_create_resized(vector, 0, sizeof(int), &resizevector);
MPI_Type_commit(&resizevector);

int recvcounts[size];
int displs[size];

for (i=0; i < size; i++)
{
recvcounts[i] = 1;
displs[i] = i;
}

MPI_Gatherv(sendbuff, NBUFF, MPI_INT, recvbuff, recvcounts, displs, resizevector, 0, comm);

if (rank == 0)
{
for(i=0; i < NBUFF*size; i++)
{
printf("%d ", recvbuff[i]);
}
printf("\n");
}

MPI_Finalize();
}

关于c - 如何干预 MPI_Gather,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37887704/

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