Como MPI_Gatherv colunas do processador, onde cada processo pode enviar um número diferente de colunas
Dizer 2 processos estão participando. O processo 0 (classificação 0) possui
A = { a d
b e
c f
}
e o processo 1 (classificação 1) tem
A = { g
h
i
}
Quero que os dois processadores enviem essas colunas para a classificação 0, para que a classificação 0 tenha o seguinte, digamos, outra matriz 2
B = { a d g
b e h
c f i
}
Crio um novo tipo de dados de coluna para o MPI_Gatherv e estou tentando o seguinte código, que não me leva a lugar algu
As minhas perguntas específicas são:
Como devo abordar issoO que deve ser o send_type e recv_type.Como os deslocamentos devem ser especificados (devem ser em termos do novo tipo de dados ou MPI_CHAR)Obrigado
Este é o meu 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;
}