У меня есть два потока (ранга 0 и 1), каждый из которых содержит трехмерную матрицу (x0, y, z) и (x1, y, z) с различным размером по измерению x. Я хотел бы отправить конкретную плоскость (постоянная x0, y, z) из первого потока во второй и заменить одну из его граней (постоянная x1, y, z). Следующий код, который я сделал, кажется, работает хорошо, когда две матрицы имеют одинаковые размеры (даже в x), но не отправляет правильную грань, когда x0! = X1:
double ***alloc2(int x, int y,int z){
int i, j;
double ***array = (double ***) malloc(sizeof(double ***)*x);
for (i = 0; i<x; i++){
array[i] = (double **) malloc(sizeof(double*)*y);
for (j=0; j<y; j++){
array[i][j] = (double *) malloc(sizeof(double)*z);}}
return array;
}
int main(int argc, char *argv[]){
MPI_Status status;
MPI_Comm_size(MPI_COMM_WORLD, &nbr);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
/* Some long code I skiped */
/* ... */
MPI_Datatype sub;
MPI_Type_vector(nL+1, nL+1, nL_thread, MPI_DOUBLE, &sub);
MPI_Type_commit(&sub);
if(rank == 0){
MPI_Send(&c_new[3][0][0], 1, sub, rank+1,01, MPI_COMM_WORLD);
MPI_Recv(&c_new[4][0][0], 1, sub, rank+1,10, MPI_COMM_WORLD, &status);}
if(rank == 1){
MPI_Recv(&c_new[0][0][0], 1, sub, rank-1,01, MPI_COMM_WORLD, &status);
MPI_Send(&c_new[1][0][0], 1, sub, rank-1,10, MPI_COMM_WORLD);}
}
nL - длина в измерениях y и z, одинаковая для всех потоков, nL_thread - это измерение x (в данном конкретном случае nL_thread = 3 для ранга 1 и 4 для ранга 0). здесь я пытаюсь заменить грани (0, y, z) ранга 1 на (3, y, z) ранга 0 и (4, y, z) ранга 0 на (1, y, z) из ранг 1.