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;
}

questionAnswers(1)

yourAnswerToTheQuestion