gpt4 book ai didi

c++ - MPI_Scatter,分散对角元素

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:47:34 25 4
gpt4 key购买 nike

我正在尝试使用 MPI 库解决一个简单的程序。

进程0上存储了4*N×4*N的矩阵,矩阵每边的长度为DIM LEN = 4*N。我需要创建一个对角数据类型。但是,数据类型应该只覆盖对角线上的 N 个连续元素,而不是 4*N。然后我必须使用创建的数据类型在 MPI 程序的进程之间平均分配该矩阵的对角线。总数进程数为 4。

散射后我无法正确接收对角线元素。

Non root : 3 
Non root : 1
2.000000 0.000000
6.000000 0.000000
Non root : 2
4.000000 0.000000

这是程序

#include "mpi.h"
#include <stdio.h>
#define DIM_LEN 8
int main( int argc, char *argv[] )
{
int myid, numprocs;
double mat[DIM_LEN][DIM_LEN];
double matRcv[DIM_LEN/4];

int i,j;
MPI_Datatype diagonal;

MPI_Init(&argc,&argv);

MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);

MPI_Type_vector(DIM_LEN/4, 1, DIM_LEN +1 , MPI_DOUBLE, &diagonal);
MPI_Type_commit(&diagonal);

if (myid == 0){
printf("Root : %d \n",myid);
for ( i=0; i<DIM_LEN; i++)
for ( j=0; j<DIM_LEN; j++ )
mat[i][j] = i+j;

for ( i=0; i<DIM_LEN; i++){
for ( j=0; j<DIM_LEN; j++ ){
printf("%lf \t",mat[i][j] );
}
printf("\n");
}

/* Scatter the big table to everybody's little table */
}

MPI_Scatter(&mat[0] , 1, diagonal, &matRcv ,1, diagonal, 0, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);

if(myid != 0){
printf("Non root : %d \n",myid);

for ( i=0; i<DIM_LEN/4; i++)
printf("%lf ",matRcv[i] );

printf("\n");
}

MPI_Type_free(&diagonal);
MPI_Finalize();
return 0;
}

最佳答案

好的。现在您已经正确跨越了您的 diagonal 数据类型,您的数据类型应该正确地反射(reflect)了您在二维数组 mat 中所需的内存位置。但是请注意,您的 diagonal 数据类型并不反射(reflect)您最终希望在一维数组 matRcv 中的内存位置。您要接收的内存位置是 DIM_LEN/4matRcv[0] 开始的连续内存槽。您可以创建第二个数据类型来描述此内存映射(使用 MPI_Type_contiguous),或者更轻松地将其称为 DIM_LEN/4 doubles

因此,您的 MPI_Scatter 调用应如下所示:

MPI_Scatter(&mat[0], 1, diagonal, &matRcv, DIM_LEN/4, MPI_DOUBLE, 0, MPI_COMM_WORLD);

另请注意,这是一个阻塞集合,因此在调用它之后不需要 MPI_Barrier();屏障是隐含的。

关于c++ - MPI_Scatter,分散对角元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35615980/

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