Cómo a las columnas MPI_Gatherv del procesador, donde cada proceso puede enviar un número diferente de columnas
os procesos de @Say 2 están participando. El proceso 0 (rango 0) tiene
A = { a d
b e
c f
}
y el proceso 1 (rango 1) tiene
A = { g
h
i
}
Quiero que ambos procesadores envíen estas columnas al rango 0 para que el rango 0 tenga lo siguiente en, digamos, otra matriz 2D.
B = { a d g
b e h
c f i
}
Creo un nuevo tipo de datos de columna para MPI_Gatherv y estoy probando el siguiente código, que no me lleva a ningún lado.
Mis preguntas específicas son:
¿Cómo debo abordar esto ¿Cuál debería ser send_type y recv_type?¿Cómo deben especificarse los desplazamientos (en caso de que sean en términos del nuevo tipo de datos o MPI_CHAR)Gracias
Este es mi código:
#include <stdio.h>
#include <mpi.h>
int main(int argc, char *argv[])
{
int numprocs, my_rank;
long int i, j;
MPI_Status status;
char **A;
char **B;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
if(my_rank == 0)
{
A = (char **)calloc((3), sizeof(char *));
B = (char **)calloc((3), sizeof(char *));
for(i=0; i<3; ++i)
{
A[i] = (char *)calloc(2, sizeof(char));
B[i] = (char *)calloc(3, sizeof(char));
}
A[0][0] = 'a';
A[1][0] = 'b';
A[2][0] = 'c';
A[0][1] = 'd';
A[1][1] = 'e';
A[2][1] = 'f';
}
else
{
A = (char **)calloc((3), sizeof(char *));
for(i=0; i<3; ++i)
{
A[i] = (char *)calloc(1, sizeof(char));
}
A[0][0] = 'g';
A[1][0] = 'h';
A[2][0] = 'i';
}
MPI_Datatype b_col_type;
MPI_Type_vector(3, 1, 1, MPI_CHAR, &b_col_type);
MPI_Type_commit(&b_col_type);
int displs[2] = {0, 2};
int recvcounts[2] = {2, 1};
MPI_Gatherv(&A[0][0], recvcounts[my_rank], b_col_type, &B[0][0], recvcounts, displs, b_col_type, 0, MPI_COMM_WORLD);
if(my_rank == 0)
{
for(i=0; i<3; ++i)
{
for(j=0; j<3; ++j)
printf("%c ", B[i][j]);
printf("\n");
}
}
MPI_Finalize();
return 0;
}