gpt4 book ai didi

c - MPI_Scatter - 发送二维数组的列

转载 作者:行者123 更新时间:2023-12-03 21:27:25 27 4
gpt4 key购买 nike

我想发送二维数组的列,每个列到单独的进程。我现在有一个完整的 2d 数组,但我被 MPI_Scatter 困住了。如何将整列作为字段发送?

谢谢

编辑:

我有数组 - float a[100][101]

我尝试通过以下方式发送数组:

float send;
MPI_Scatter ((void *)a, n, MPI_FLOAT,(void *)&send , 1, MPI_INT,0, MPI_COMM_WORLD);

编辑2:

我制作了新的 type_vector:
               MPI_Datatype newtype;

MPI_Type_vector(n, /* # column elements */
1, /* 1 column only */
n+1, /* skip n+1 elements */
MPI_FLOAT, /* elements are float */
&newtype); /* MPI derived datatype */

MPI_Type_commit(&newtype);

现在我试图将它发送到我的其他进程。矩阵由浮点数填充,我的矩阵是 n x n+1,用于测试的是 n=5,所以它是矩阵 5 x 6。Scatter 的什么调用会起作用,我应该从其他进程的一边采取什么方法?我的意思是,如何获取由 scatter 发送的数据?

最佳答案

这与这个问题非常相似:How to MPI_Gatherv columns from processor, where each process may send different number of columns .问题是列在内存中不是连续的,所以你必须四处游荡。

与 C 中的情况一样,缺少真正的多维数组,您必须对内存布局稍加小心。我相信在 C 中,静态声明的数组是这样的

float a[nrows][ncols]

将在内存中是连续的,所以你现在应该没问题。但是,请注意,一旦进入动态分配,情况将不再如此;您必须一次分配所有数据以确保获得连续数据,例如
float **floatalloc2d(int n, int m) {
float *data = (float *)malloc(n*m*sizeof(float));
float **array = (float **)calloc(n*sizeof(float *));
for (int i=0; i<n; i++)
array[i] = &(data[i*m]);

return array;
}

float floatfree2d(float **array) {
free(array[0]);
free(array);
return;
}

/* ... */
float **a;
nrows = 3;
ncols = 2;
a = floatalloc2d(nrows,ncols);

但我认为你现在还好。

现在您已经以某种方式拥有了二维数组,您必须创建您的类型。如果您只是发送一列,您所描述的类型就可以了;但这里的技巧是,如果您要发送多列,即使列本身几乎跨越整个数组,每列也仅从前一列的开头开始一个浮点数!因此,您需要移动类型的上限才能使其工作:
       MPI_Datatype col, coltype;

MPI_Type_vector(nrows,
1,
ncols,
MPI_FLOAT,
&col);

MPI_Type_commit(&col);
MPI_Type_create_resized(col, 0, 1*sizeof(float), &coltype);
MPI_Type_commit(&coltype);

会做你想做的。请注意,接收进程将与发送进程具有不同的类型,因为它们存储的列数较少;所以元素之间的步幅更小。

最后,你现在可以做你的分散,
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
if (rank == 0) {
a = floatalloc2d(nrows,ncols);
sendptr = &(a[0][0]);
} else {
sendptr = NULL;
}
int ncolsperproc = ncols/size; /* we're assuming this divides evenly */
b = floatalloc(nrows, ncolsperproc);

MPI_Datatype acol, acoltype, bcol, bcoltype;

if (rank == 0) {
MPI_Type_vector(nrows,
1,
ncols,
MPI_FLOAT,
&acol);

MPI_Type_commit(&acol);
MPI_Type_create_resized(acol, 0, 1*sizeof(float), &acoltype);
}
MPI_Type_vector(nrows,
1,
ncolsperproc,
MPI_FLOAT,
&bcol);

MPI_Type_commit(&bcol);
MPI_Type_create_resized(bcol, 0, 1*sizeof(float), &bcoltype);
MPI_Type_commit(&bcoltype);

MPI_Scatter (sendptr, ncolsperproc, acoltype, &(b[0][0]), ncolsperproc, bcoltype, 0, MPI_COMM_WORLD);

关于c - MPI_Scatter - 发送二维数组的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5512245/

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