Im Prinzip wird die gesammte Kommunikation über nur zwei Befehle
bewerkstelligt:
MPI_Send verschickt eine Botschaft an einen anderen Prozess.
MPI_Recv versucht einen Botschaft zu empfangen.
Ein kurzes MPI-Programm könnte in etwa so aussehen:
/* beispielprogramm */ /* parallele matrixmultiplikation mit mpi */ #include <stdio.h> #include "mpi.h" #define SIZE 4 int main(int argc, char **argv) { int myrank, mysize; MPI_Status stat; int i, j; float matrix1[SIZE][SIZE], matrix2[SIZE][SIZE], result[SIZE][SIZE]; /* initialisierungen */ MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myrank); MPI_Comm_size(MPI_COMM_WORLD, &mysize); if (mysize != SIZE) { fprintf(stderr, "error: num of processes does not match matrix-size\n"); exit(1); } /* prozess 0 erzeugt 2 matrizen, die multipliziert werden sollen */ if (myrank == 0) { for (i=0; i<SIZE; i++) for (j=0; j<SIZE; j++) { matrix1[i][j] = 1; matrix2[i][j] = 1; result[i][j] = 0; } printf("matrix1:\n"); for (i=0; i<SIZE; i++) { for (j=0; j<SIZE; j++) printf("%f ", matrix1[i][j]); printf("\n"); } printf("matrix2:\n"); for (i=0; i<SIZE; i++) { for (j=0; j<SIZE; j++) printf("%f ", matrix2[i][j]); printf("\n"); } /* matrizen werden auf die uebrigen prozesse aufgeteilt */ for (i=1; i<mysize; i++) { MPI_Send(matrix1, SIZE*SIZE, MPI_FLOAT, i, 47, MPI_COMM_WORLD); MPI_Send(matrix2, SIZE*SIZE, MPI_FLOAT, i, 11, MPI_COMM_WORLD); } } else { /* die uebrigen prozesse muessen die daten empfangen */ MPI_Recv(matrix1, SIZE*SIZE, MPI_FLOAT, 0, 47, MPI_COMM_WORLD, &stat); MPI_Recv(matrix2, SIZE*SIZE, MPI_FLOAT, 0, 11, MPI_COMM_WORLD, &stat); } /* jeder prozess besitzt jetzt beide matrizen */ /* berechnung */ for (i=0; i<SIZE; i++) { for (j=0; j<SIZE; j++) { result[myrank][i] += matrix1[myrank][j] * matrix2[j][i]; } } if (myrank == 0) { for (i=1; i<mysize; i++) MPI_Recv(result[i*SIZE], SIZE, MPI_FLOAT, i, 13, MPI_COMM_WORLD, &stat); printf("result: \n"); for (i=0; i<SIZE; i++) { for (j=0; j<SIZE; j++) printf("%f ", result[i][j]); printf("\n"); } } else MPI_Send(result[myrank*SIZE], SIZE, MPI_FLOAT, 0, 13, MPI_COMM_WORLD); MPI_Finalize(); return(0); }