/* file: move.c compile: cc move.c -lmpi run: mpirun -np 4 ./a.out */ #include #include "mpi.h" #define N 4 #define M 4 main(int argc, char* argv[]) { int A[M][N] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11 ,12}, {13, 14, 15, 16}}, local_A[N][M]; int X[N] = {1, 2, 3, 4}, local_X[N]; int Y[N], local_Y[N]; int local_m, local_n; int i,j; int p; int myrank; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &p); MPI_Comm_rank(MPI_COMM_WORLD, &myrank); local_m = M/p; local_n = N/p; MPI_Scatter(A, local_m*N, MPI_INT, local_A, local_m*N, MPI_INT, 0, MPI_COMM_WORLD); MPI_Scatter(X, local_n, MPI_INT, local_X, local_n, MPI_INT, 0, MPI_COMM_WORLD); MPI_Allgather(local_X, local_n, MPI_INT, X, local_n, MPI_INT, MPI_COMM_WORLD); for (i = 0; i < local_m; i++) { local_Y[i] = 0; for (j = 0; j < N; j++) local_Y[i] = local_Y[i] + local_A[i][j]*X[j]; } MPI_Gather(local_Y, local_m, MPI_INT, Y, local_m, MPI_INT, 0, MPI_COMM_WORLD); if (myrank == 0){ for (i=0; i