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

Respuestas a la pregunta(1)

Su respuesta a la pregunta