gpt4 book ai didi

mpi - MPI_Gather 函数的困难

转载 作者:行者123 更新时间:2023-12-01 10:03:10 26 4
gpt4 key购买 nike

我在每个处理器(假设 3 个处理器)的本地数组(名为 lvotes)上都有一个值,每个处理器的第一个元素都存储一个值,即:

P0 : 4
P1 : 6
p2 : 7

现在,使用 MPI_Gather,我想将它们全部收集到 P0 中,所以它看起来像:

P0 : 4, 6, 7

我用这种方式收集:

MPI_Gather(lvotes, P, MPI_INT, lvotes, 1, MPI_INT, 0, MPI_COMM_WORLD);

但我遇到了问题。这是我第一次在 MPI 中编码。我可以使用任何建议。谢谢

最佳答案

这是第一次使用聚集/分散集合的人的常见问题;在发送和接收计数中,您指定要发送到或从 each 进程接收的项目计数。因此,尽管您确实会获得(比如说)P 项,但如果 P 是处理器的数量,那不是您指定的集合手术;您指定您发送的计数为 1,并且接收的计数为 1(来自每个进程)。像这样:

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

int main ( int argc, char **argv ) {

int rank;
int size;

int lvotes;
int *gvotes;

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

if (rank == 0)
gvotes = malloc(size * sizeof(int) );

/* everyone sets their first lvotes element */
lvotes = rank+4;

/* Gather to process 0 */
MPI_Gather(&lvotes, 1, MPI_INT, /* send 1 int from lvotes.. */
gvotes, 1, MPI_INT, /* gather 1 int each process into lvotes */
0, MPI_COMM_WORLD); /* ... to root process 0 */


printf("P%d: %d\n", rank, lvotes);
if (rank == 0) {
printf("P%d: Gathered ", rank);
for (int i=0; i<size; i++)
printf("%d ", gvotes[i]);
printf("\n");
}

if (rank == 0)
free(gvotes);

MPI_Finalize();

return 0;
}

运行给予

$ mpirun -np 3 ./gather
P1: 5
P2: 6
P0: 4
P0: Gathered 4 5 6

关于mpi - MPI_Gather 函数的困难,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13842047/

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