Можно
привожу кусок кода:
typedef struct
{
double D[ N_mpi ];
double S[ N_mpi ];
double tau[ N_mpi ];
int j;
} mpi_buffer;
mpi_buffer buf_begin, buf_end;
MPI_Datatype mpi_bufferType;
int len[5] = { N_mpi, N_mpi, N_mpi, 1, 1 };
MPI_Aint pos[5] = { offsetof(mpi_buffer,D), offsetof(mpi_buffer,S),
offsetof(mpi_buffer,tau), offsetof(mpi_buffer,j),
sizeof(mpi_buffer) };
MPI_Datatype typ[5] = { MPI_DOUBLE,MPI_DOUBLE,MPI_DOUBLE,MPI_INT,MPI_UB };
MPI_Type_struct( 5, len, pos, typ, &mpi_bufferType );
MPI_Type_commit( &mpi_bufferType );
пересылка осуществлялась так
(0 и n-1 процесс принимали и посылали только конец и начало соответственно)
MPI_Sendrecv( &buf_begin, 1, mpi_bufferType, rank-1, 1,
&buf_begin, 1, mpi_bufferType, rank-1, 0, MPI_COMM_WORLD, &status );
MPI_Sendrecv( &buf_end , 1, mpi_bufferType, rank+1, 0,
&buf_end , 1, mpi_bufferType, rank+1, 1, MPI_COMM_WORLD, &status );
Замана функции MPI_Sendrecv на MPI_Send и MPI_recv исправили возникающие ошибки.