Estoy tratando de transponer una matriz usando MPI en C. Cada proceso tiene una submatriz cuadrada, y quiero enviar eso al proceso correcto (el 'opuesto' en la cuadrícula), transponerlo como parte de la comunicación .¿Se puede transponer una matriz al enviar utilizando MPI_Type_create_subarray?
Estoy usando MPI_Type_create_subarray
que tiene un argumento para la orden, ya sea MPI_ORDER_C
o MPI_ORDER_FORTRAN
para row-major y column-major, respectivamente. Pensé que si enviaba como uno de estos, y recibí como el otro, entonces mi matriz sería transpuesta como parte de la comunicación. Sin embargo, esto no parece suceder, simplemente no se transpone.
La parte importante del código está debajo, y todo el archivo de código está disponible en this gist. ¿Alguien tiene alguna idea de por qué esto no está funcionando? ¿Debería funcionar este enfoque para hacer la transposición? Lo hubiera pensado, habiendo leído las descripciones de MPI_ORDER_C
y MPI_ORDER_FORTRAN
, pero tal vez no.
/* ----------- DO TRANSPOSE ----------- */
/* Find the opposite co-ordinates (as we know it's a square) */
coords2[0] = coords[1];
coords2[1] = coords[0];
/* Get the rank for this process */
MPI_Cart_rank(cart_comm, coords2, &rank2);
/* Send to these new coordinates */
tag = (coords[0] + 1) * (coords[1] + 1);
/* Create new derived type to receive as */
/* MPI_Type_vector(rows_in_core, cols_in_core, cols_in_core, MPI_DOUBLE, &vector_type); */
sizes[0] = rows_in_core;
sizes[1] = cols_in_core;
subsizes[0] = rows_in_core;
subsizes[1] = cols_in_core;
starts[0] = 0;
starts[1] = 0;
MPI_Type_create_subarray(2, sizes, subsizes, starts, MPI_ORDER_FORTRAN, MPI_DOUBLE, &send_type);
MPI_Type_commit(&send_type);
MPI_Type_create_subarray(2, sizes, subsizes, starts, MPI_ORDER_C, MPI_DOUBLE, &recv_type);
MPI_Type_commit(&recv_type);
/* We're sending in row-major form, so it's just rows_in_core * cols_in_core lots of MPI_DOUBLE */
MPI_Send(&array[0][0], 1, send_type, rank2, tag ,cart_comm);
/* Receive from these new coordinates */
MPI_Recv(&new_array[0][0], 1, recv_type, rank2, tag, cart_comm, &status);
No puedo votar esto lo suficiente. Acabo de pasar un largo viaje de ida y vuelta con un colega que ayudó a diseñar MPI-2 (!) Sobre MPI_ORDER_C frente a MPI_ORDER_FORTRAN y sus efectos. –