MPI_Gather 的问题无法将 8 个 32 个元素的数组收集到一个 256 个元素的大数组中
Posted
技术标签:
【中文标题】MPI_Gather 的问题无法将 8 个 32 个元素的数组收集到一个 256 个元素的大数组中【英文标题】:Problem with MPI_Gather Couldnt gather 8 arrays of 32 element into a big array of 256 elements 【发布时间】:2022-01-17 20:17:53 【问题描述】:我是 MPI 新手,我有一个 256 整数数组,我想将每个数字除以 16,我建议在每个处理器上分散 32 个元素,但我无法收集它们,因为每个返回值都包含 32 数组
int globalhistogram[256];
float globalProb[256];
float* localprob = new float[32];
int localpixel[32];
MPI_Scatter(&globalhistogram, 32, MPI_INT, localpixel, 32, MPI_INT, 0, MPI_COMM_WORLD);
for (int i = 0; i < 32; i++)
localprob[i] = (float)localpixel[i] / 16;
MPI_Gather(localprob, 32, MPI_FLOAT, &globalprob, 32, MPI_FLOAT, 0, MPI_COMM_WORLD);
【问题讨论】:
在分散调用中,将&globalhistogram
更改为histogram
,在收集调用中,将&globalprob
更改为globalprob
。您的间接级别太高了:globalprob
已经是缓冲区地址。
你正在运行 8 个 MPI 任务,对吧?
是的 8 个任务,我想将每个任务的输出收集到一个数组中,但每个任务都返回一个包含 32 个元素的数组
【参考方案1】:
我不明白这个问题 - 在我更正我认为是错字 float globalProb[256]
-> float globalprob[256]
后,代码似乎可以正常运行。
我同意@victor-eijkhout 关于&globalprob
问题的看法,但似乎没有什么不同。
如果我编译并运行附加的代码,我会得到预期的答案:
dsh@laptop$ mpicxx -o play play.cpp
dsh@laptop$ mpirun -n 8 ./play
rank 0: globalprob[0] = 0.000000
...
rank 0: globalprob[31] = 31.000000
rank 0: globalprob[32] = 64.000000
...
rank 0: globalprob[255] = 2040.000000
这是完整的代码:
#include <stdio.h>
#include <mpi.h>
int main(void)
int rank, size, i;
MPI_Init(NULL, NULL);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
int globalhistogram[256];
float globalprob[256];
float* localprob = new float[32];
int localpixel[32];
for (i=0; i < 256; i++)
globalhistogram[i] = i;
MPI_Scatter(&globalhistogram, 32, MPI_INT, localpixel, 32, MPI_INT, 0, MPI_COMM_WORLD);
for (int i = 0; i < 32; i++)
localprob[i] = (float)localpixel[i] *(rank+1);
MPI_Gather(localprob, 32, MPI_FLOAT, &globalprob, 32, MPI_FLOAT, 0, MPI_COMM_WORLD);
if (rank == 0)
for (i=0; i < 256; i++)
printf("rank %d: globalprob[%d] = %f\n", rank, i, globalprob[i]);
MPI_Finalize();
【讨论】:
以上是关于MPI_Gather 的问题无法将 8 个 32 个元素的数组收集到一个 256 个元素的大数组中的主要内容,如果未能解决你的问题,请参考以下文章
使用 MPI_Gather 在 Fortran 中发送二维数组
在 C 中使用 MPI_Type_Vector 和 MPI_Gather
如何从 C 中使用 MPI_Scatter 和 MPI_Gather?
为什么一个指针在32位系统中占4个字节,在64位系统中占8个字节?
Android 8.1 自定义热点的时候设置了热点maxLength="32",但是在希伯来语等状态下还是发现在没到32个字符之前就无法把热点设置成功了