int procs_cart_rank, procs_coords[2];
dims[0] = dims[1] = procs_size_sqrt;
periods[0] = periods[1] = true;
MPI_Cart_create(MPI_COMM_WORLD, 2, dims, periods, false, &cart_all);
MPI_Comm_rank(cart_all, &procs_cart_rank);
MPI_Cart_coords(cart_all, procs_cart_rank, 2, procs_coords);
MPI_Comm_split(cart_all, procs_coords[0], procs_coords[1], &cart_row);
MPI_Comm_split(cart_all, procs_coords[1], procs_coords[0], &cart_col);
int rank_cart_row, rank_cart_col;
MPI_Comm_rank(cart_row, & rank_cart_row);
MPI_Comm_rank(cart_col, & rank_cart_col);
// 计算并传递
for (int round = 0; round < procs_size_sqrt; ++ round) ...{
MPI_Isend(B, n_sqr, MPI_INT, (procs_coords[0] - 1 + procs_size_sqrt) % procs_size_sqrt,
1, cart_col, &reqSend);
int broader = (round + procs_coords[0]) % procs_size_sqrt;
if (broader == procs_coords[1]) std::copy(A,A+n_sqr,T);
MPI_Bcast(T, n_sqr, MPI_INT, broader , cart_row);
for (int row=0; row
}
// 释放
MPI_Comm_free(&cart_col);
MPI_Comm_free(&cart_row);
MPI_Comm_free(&cart_all);
delete []A;
delete []B;
delete []C;
delete []T;
end_time = MPI_Wtime();
MPI_Finalize();
printf("task %d consumed %lf seconds ", procs_id, end_time-start_time);
return 0;
}