Αντώνης Σιδηρόπουλος Τμήμα Πληροφορικής ΤΕΙ Θεσσαλονίκης MPI Jacobi iterations
Jacobi Method Μαθήματα MPI 2 Μέθοδος για την επίλυση συστήματος γραμμικών εξισώσεων. 5x+3y+8z=5 7x+2y-2z=10 x+y-4z=0 (x,y,z)=(?,?,?) Α. Σιδηρόπουλος
Jacobi Method Μαθήματα MPI 3 Α. Σιδηρόπουλος
Jacobi Method Μαθήματα MPI 4 x y z Α. Σιδηρόπουλος
Jacobi Method Μαθήματα MPI 5 x y z … Α. Σιδηρόπουλος
Μαθήματα MPI 6 Έστω μια εξίσωση με 9χ9 =81 αγνώστους x i,j Με i=1..9 και j=1..9 Η εξίσωση: x i,j =(x i-1,j + x i+1,j + x i,j-1 + x i,j+1 )/4 Α. Σιδηρόπουλος
Iteration του αλγορίθμου (4 γείτονες) Για κάθε κόμβο i,j υπολόγισε: A[i][j] = (A[i-1][j]+A[i+1][j]+A[i][j-1]+A[i][j+1] + A[i][j])/4 i=1 i=2 i=3 i=4 i=5 i=6 i=7 i=8 i=9 j=1 j=2 j=3 j=4 j=5 j=6 j=7 j=8 j=9 i,ji,j+1i,j−1 i+1,j i−1,j Μαθήματα MPI 7 Οι περιμετρικοί κόμβοι δεν θα υπολογίζονται Α. Σιδηρόπουλος
Αρχικοποίηση Μαθήματα MPI 8 SIZE=7 for(i=0;i<=SIZE+1;i++) { for(j=0;j<=SIZE+1;j++) { Xold[i][j]=1; X[i][j]=1; } X[i][0]=-1; X[i][SIZE+1]=-1; Xold[i][0]=-1; Xold[i][SIZE+1]=-1; } Α. Σιδηρόπουλος
Iteration Μαθήματα MPI 9 iterations++; for(i=1;i<=SIZE;i++) { for(j=1;j<=SIZE;j++) { up=Xold[i-1][j]; down=Xold[i+1][j]; left=Xold[i][j-1]; right=Xold[i][j+1]; X[i][j]=(up+down+left+right)/4.0; } Α. Σιδηρόπουλος
Έλεγχος Μαθήματα MPI 10 diff=0; for(i=0;i<=SIZE+1;i++) { for(j=0;j<=SIZE+1;j++) { diff+=(X[i][j]-Xold[i][j])* (X[i][j]-Xold[i][j]); } if(sqrt(diff) 1000) { ok=1; } memcpy(Xold,X,(sizeof(double)*(SIZE+2)*(SIZE+2))); Α. Σιδηρόπουλος
Κατανομή γραμμών σε p=3 διεργασίες Διεργασία 0 Διεργασία 1 Διεργασία 2 Μαθήματα MPI 11 Α. Σιδηρόπουλος
Επικοινωνία μεταξύ διεργασιών Διεργασία 0 Διεργασία 1 Διεργασία 2 Μαθήματα MPI 12 Α. Σιδηρόπουλος
Επικοινωνία μεταξύ διεργασιών Διεργασία 0 Διεργασία 1 Διεργασία 2 Μαθήματα MPI 13 Α. Σιδηρόπουλος
(Σενάριο 1) Μαθήματα MPI 14 Αν χρησιμοποιήσουμε blocking Send, τότε τα μηνύματα θα πάνε ( σχεδόν ) σειριακά /// inform next process for my last line if(rank<size-1) { MPI_Send(Xold[last_line], SIZE+2, MPI_DOUBLE, rank+1, 1, MPI_COMM_WORLD); } /// be informed from prev process for my pre-first line if(rank>0) { MPI_Recv(Xold[first_line-1], SIZE+2, MPI_DOUBLE, rank-1, 1, MPI_COMM_WORLD,&status); } /// inform previous process for my first line if(rank>0) { MPI_Send(Xold[first_line], SIZE+2, MPI_DOUBLE, rank-1, 2, MPI_COMM_WORLD); } /// Be informed from next process for my after-last line. if(rank<size-1) { MPI_Recv(Xold[last_line+1], SIZE+2, MPI_DOUBLE, rank+1, 2, ΜPI_COMM_WORLD,&status); } Α. Σιδηρόπουλος
(Σενάριο 1) Μαθήματα MPI 15 PROC 0 Send Last to Recv afterLast from 1 PROC 1 Send Last to 2 Recv before first from 0 Send first to 0 Recv afterLast from 2 PROC Recv before first from 1 Send first to Α. Σιδηρόπουλος
Μαθήματα MPI 16 PROC 0 Send Last to 1 Recv afterLast from 1 PROC 1 Send Last to 2 Recv before first from 0 Send first to 0 Recv afterLast from 2 PROC 2 Recv before first from 1 Send first to 1 Time Α. Σιδηρόπουλος (Σενάριο 1)
Αν είχαμε 5 διεργασίες (Σενάριο 1) Μαθήματα MPI 17 PROC 0 Send Last to Recv afterLast from 1 PROC 1 Send Last to 2 Recv before first from 0 Send first to 0 Recv afterLast from 2 PROC Recv before first from 3 Send first to PROC 2 Send Last to 3 Recv before first from 1 Send first to 1 Recv afterLast from 3 PROC 3 Send Last to 4 Recv before first from 2 Send first to 2 Recv afterLast from 4 Α. Σιδηρόπουλος
Αν είχαμε 5 διεργασίες (Σενάριο 1) PROC 0 Send Last to 1 Recv afterLast from 1 PROC 1 Send Last to 2 Recv before first from 0 Send first to 0 Recv afterLast from 2 PROC 4 Recv before first from 3 Send first to 3 PROC 2 Send Last to 3 Recv before first from 1 Send first to 1 Recv afterLast from 3 PROC 3 Send Last to 4 Recv before first from 2 Send first to 2 Recv afterLast from 4 Time Μαθήματα MPI 18 Α. Σιδηρόπουλος
Σενάριο 2 Μαθήματα MPI 19 Αν Αλλάξουμε την σειρά από τα 2 τελευταία Send-Recv /// inform next process for my last line if(rank<size-1) { MPI_Send(Xold[last_line], SIZE+2, MPI_DOUBLE, rank+1, 1, MPI_COMM_WORLD); } /// be informed from prev process for my pre-first line if(rank>0) { MPI_Recv(Xold[first_line-1], SIZE+2, MPI_DOUBLE, rank-1, 1, MPI_COMM_WORLD,&status); } Α. Σιδηρόπουλος /// Be informed from next process for my after-last line. if(rank<size-1) { MPI_Recv(Xold[last_line+1], SIZE+2, MPI_DOUBLE, rank+1, 2, ΜPI_COMM_WORLD,&status); } /// inform previous process for my first line if(rank>0) { MPI_Send(Xold[first_line], SIZE+2, MPI_DOUBLE, rank-1, 2, MPI_COMM_WORLD); }
Αν είχαμε 5 διεργασίες (Σενάριο 2) Μαθήματα MPI 20 PROC 0 Send Last to Recv afterLast from PROC 1 Send Last to 2 Recv before first from 0 Recv afterLast from 2 Send first to 0 PROC Recv before first from Send first to 3 PROC 2 Send Last to 3 Recv before first from 1 Recv afterLast from 3 Send first to 1 PROC 3 Send Last to 4 Recv before first from 2 Recv afterLast from 4 Send first to 2 Α. Σιδηρόπουλος
Αν είχαμε 5 διεργασίες (Σενάριο 2) PROC 0 Send Last to 1 Recv afterLast from 1 PROC 1 Send Last to 2 Recv before first from 0 Recv afterLast from 2 Send first to 0 PROC 4 Recv before first from 3 Send first to 3 PROC 2 Send Last to 3 Recv before first from 1 Recv afterLast from 3 Send first to 1 PROC 3 Send Last to 4 Recv before first from 2 Recv afterLast from 4 Send first to 2 Time Μαθήματα MPI 21 Α. Σιδηρόπουλος
(Σενάριο 3) Μαθήματα MPI 22 Αν Αλλάξουμε την σειρά ώστε όλες οι διεργασίες να κάνουν πρώτα τα Send και μετά τα receive: /// inform next process for my last line if(rank<size-1) { MPI_Send(Xold[last_line], SIZE+2, MPI_DOUBLE, rank+1, 1, MPI_COMM_WORLD); } Α. Σιδηρόπουλος /// Be informed from next process for my after-last line. if(rank<size-1) { MPI_Recv(Xold[last_line+1], SIZE+2, MPI_DOUBLE, rank+1, 2, ΜPI_COMM_WORLD,&status); } /// inform previous process for my first line if(rank>0) { MPI_Send(Xold[first_line], SIZE+2, MPI_DOUBLE, rank-1, 2, MPI_COMM_WORLD); } /// be informed from prev process for my pre-first line if(rank>0) { MPI_Recv(Xold[first_line-1], SIZE+2, MPI_DOUBLE, rank-1, 1, MPI_COMM_WORLD,&status); }
Αν είχαμε 5 διεργασίες ((Σενάριο 3) Μαθήματα MPI 23 PROC 0 Send Last to Recv afterLast from PROC 1 Send Last to 2 Send first to 0 Recv before first from 0 Recv afterLast from 2 PROC Send first to 3 Recv before first from PROC 2 Send Last to 3 Send first to 1 Recv before first from 1 Recv afterLast from 3 PROC 3 Send Last to 4 Send first to 2 Recv before first from 2 Recv afterLast from 4 Α. Σιδηρόπουλος
Αν είχαμε 5 διεργασίες (Σενάριο 3) Μαθήματα MPI 24 PROC 0 Send Last to 1 Recv afterLast from 1 PROC 1 Send Last to 2 Send first to 0 Recv before first from 0 Recv afterLast from 2 PROC 4 Send first to 3 Recv before first from 3 PROC 2 Send Last to 3 Send first to 1 Recv before first from 1 Recv afterLast from 3 PROC 3 Send Last to 4 Send first to 2 Recv before first from 2 Recv afterLast from 4 Α. Σιδηρόπουλος Time Deadlock Μη αποδεκτή λύση
Μαθήματα MPI 25 Για καλύτερη επιτάχυνση θα πρέπει να χρησιμοποιηθεί non-blocking Send & Receive Α. Σιδηρόπουλος
Αν είχαμε 5 διεργασίες με non-blocking (Σενάριο 4) Μαθήματα MPI 26 PROC 0 Send Last to Recv afterLast from 1 PROC 1 Send Last to 2 Recv before first from 0 Send first to 0 Recv afterLast from 2 PROC Recv before first from 3 Send first to PROC 2 Send Last to 3 Recv before first from 1 Send first to 1 Recv afterLast from 3 PROC 3 Send Last to 4 Recv before first from 2 Send first to 2 Recv afterLast from 4 Time Barrier Α. Σιδηρόπουλος
Μέθοδοι επικοινωνίας Μαθήματα MPI Α. Σιδηρόπουλος 27 Άλλες λύσεις ?
Αν είχαμε 5 διεργασίες με blocking (Σενάριο 5) Μαθήματα MPI 28 PROC 0 PROC 1PROC 4PROC 2PROC 3 Time Barrier Α. Σιδηρόπουλος Αντί όλες οι διεργασίες να κάνουν με την ίδια σειρά Send-Receive να το κάνουν εναλλάξ.
Αν είχαμε 5 διεργασίες με blocking (Σενάριο 5) Μαθήματα MPI 29 PROC 0 Send Last to Recv afterLast from 1 PROC 1 Recv before first from 0 Send Last to 2 Recv afterLast from 2 Send first to 0 PROC Recv before first from 3 Send first to PROC 2 Send Last to 3 Recv before first from 1 Send first to 1 Recv afterLast from 3 PROC 3 Recv before first from 2 Send Last to 4 Recv afterLast from 4 Send first to 2 Time Α. Σιδηρόπουλος Διαφορετική σειρά Send-Receive στις μονές - ζυγές διεργασίες. Οι μονές διεργασίες Receive-Send, οι ζυγές Send-Receive.
Επικοινωνία μεταξύ διεργασιών Διεργασία 0 Διεργασία 1 Διεργασία 2 Μαθήματα MPI 30 Diff_sum Global_Diff_sum MPI_Reduce Με βάση το Global_Diff_sum η διεργασία 0 θα αποφασίσει αν τελειώσαμε. Θα θέσει την μεταβλητή ΟΚ και θα την κάνει Bcast σε όλες. Α. Σιδηρόπουλος
Συλλογή αποτελεσμάτων Διεργασία 0 Διεργασία 1 Διεργασία 2 Μαθήματα MPI 31 Α. Σιδηρόπουλος
Iteration του αλγορίθμου (8 γείτονες) A[i][j] = f( A[i−1][j−1], A[i−1][j], A[i−1][j+1], A[i][j−1], A[i][j], A[i][j+1], A[i+1][j−1], A[i+1][j], A[i+1][j+1] ) i=1 i=2 i=3 i=4 i=5 i=6 i=7 i=8 i=9 j=1 j=2 j=3 j=4 j=5 j=6 j=7 j=8 j=9 i,ji,j+1i,j−1 i+1,j i−1,j Μαθήματα MPI 32 i+1,j+1i+1,j−1 i−1,j−1i−1,j+1 Α. Σιδηρόπουλος