在MPI和C中以块形式发送结构的2D数组

时间:2018-08-29 10:53:16

标签: c matrix struct mpi block

我有以下问题:

在我的代码中,我定义了以下矩阵:

col_1

此外,它被声明为自定义类型typedef struct { float valor_actual; int direccion; } punto; punto matriz[X][Y];

mpi_punto

然后,主进程(等级= 0)将矩阵发送给其他进程。矩阵按列划分:

MPI_Datatype mpi_punto;

int count = 2;
int blocklens[] = {1,1};

MPI_Aint indices[2];
MPI_Type_extent(MPI_DOUBLE, &indices[0]);
MPI_Type_extent(MPI_DOUBLE, &indices[1]);


MPI_Datatype old_types[] = {MPI_FLOAT,MPI_INT}; 

MPI_Type_struct(count,blocklens,indices,old_types,&mpi_punto);
MPI_Type_commit(&mpi_punto); 

这是其他进程的代码:

if (rango == 0) //Proceso maestro
{
//Inicializamos la matriz
    for (i=0; i< X; i++)
    {
        for (j=0; j < Y; j++)
        {
            matriz[i][j].valor_actual= 0.0;

        }
    }

col_por_proceso = Y/num_esclavos;
resto = Y%num_esclavos;
desplz = 0;
for (i=1; i<=num_esclavos; i++)
{
        MPI_Send(&matriz[0][desplz],X*columnas,mpi_punto,i,1,MPI_COMM_WORLD);


        desplz = desplz + columnas;
} .....

在上面的代码中,每个进程用数字4.0填充单元格if (rango != 0) //Procesos { MPI_Recv(&matriz[0][desplz],X*columnas,mpi_punto,0,1,MPI_COMM_WORLD,&estado); matriz[0][rango].valor_actual = 4.0; printf("proceso %d -> %8.1f\n",rango, matriz[0][rango].valor_actual); MPI_Send(&matriz[0][desplz], X*columnas, mpi_punto, 0, 4, MPI_COMM_WORLD); } 并将其矩阵块发送给主单元。

母版从流程中收集数据,当我打印结果时,矩阵的所有值均为0.0,并且没有单元格的值为4.0。我想打印字段matriz[0][number of Rank of the process]的值,并且该字段属于结构valor_actual。矩阵中的每个单元格都有一个结构punto

punto

但是,主计算机没有发送结构矩阵,而是发送浮点矩阵(for (j = 0; j < Y; j++) { printf("maestro (%d y %d) %8.1f\n",0,j, matriz[i][j].valor_actual); } ),然后在我打印结果时,第0行中的单元格的值为4.0

会有什么问题?

谢谢。

0 个答案:

没有答案