330 likes | 516 Views
MPI Jacobi iterations. Αντώνης Σιδηρόπουλος Τμήμα Πληροφορικής ΤΕΙ Θεσσαλονίκης. Jacobi Method . Μέθοδος για την επίλυση συστήματος γραμμικών εξισώσεων. 5 x+3y+8z=5 7x+2y-2z=10 x+y-4z=0 ( x,y,z )=(?,?,?). Jacobi Method . Jacobi Method . Jacobi Method . ….
E N D
MPI Jacobi iterations Αντώνης Σιδηρόπουλος Τμήμα Πληροφορικής ΤΕΙ Θεσσαλονίκης
Jacobi Method • Μέθοδος για την επίλυση συστήματος γραμμικών εξισώσεων. 5x+3y+8z=5 7x+2y-2z=10 x+y-4z=0 (x,y,z)=(?,?,?) Α.Σιδηρόπουλος
Jacobi Method Α.Σιδηρόπουλος
Jacobi Method Α.Σιδηρόπουλος
Jacobi Method … Α.Σιδηρόπουλος
Έστω μια εξίσωση με 9χ9 =81 αγνώστους xi,j • Με i=1..9 και j=1..9 • Η εξίσωση: xi,j=(xi-1,j+ xi+1,j+ xi,j-1 + xi,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 j=2 j=1 j=4 j=6 j=9 j=3 j=5 j=8 j=7 i=1 Οι περιμετρικοί κόμβοι δεν θα υπολογίζονται i=2 i=3 i−1,j i=4 i,j−1 i,j i,j+1 i=5 i+1,j i=6 i=7 i=8 i=9 Α.Σιδηρόπουλος
Αρχικοποίηση 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 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; } } Α.Σιδηρόπουλος
Έλεγχος 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)<0.00000001 || iterations>1000) { ok=1; } memcpy(Xold,X,(sizeof(double)*(SIZE+2)*(SIZE+2))); Α.Σιδηρόπουλος
Κατανομή γραμμών σε p=3 διεργασίες Διεργασία 0 Διεργασία 1 Διεργασία 2 Α.Σιδηρόπουλος
Επικοινωνία μεταξύ διεργασιών Διεργασία 0 Διεργασία 1 Διεργασία 2 Α.Σιδηρόπουλος
Επικοινωνία μεταξύ διεργασιών Διεργασία 0 Διεργασία 1 Διεργασία 2 Α.Σιδηρόπουλος
(Σενάριο 1) Αν χρησιμοποιήσουμε 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) Α.Σιδηρόπουλος
(Σενάριο 1) Time Α.Σιδηρόπουλος
Αν είχαμε 5 διεργασίες (Σενάριο 1) Α.Σιδηρόπουλος
Αν είχαμε 5 διεργασίες (Σενάριο 1) Time Α.Σιδηρόπουλος
Σενάριο 2 Αν Αλλάξουμε την σειρά από τα 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); } • /// 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); } Α.Σιδηρόπουλος
Αν είχαμε 5 διεργασίες (Σενάριο 2) Α.Σιδηρόπουλος
Αν είχαμε 5 διεργασίες (Σενάριο 2) Time Α.Σιδηρόπουλος
(Σενάριο 3) Αν Αλλάξουμε την σειρά ώστε όλες οι διεργασίες να κάνουν πρώτα τα Send και μετά τα receive: • /// 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 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); } • /// 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); } Α.Σιδηρόπουλος
Αν είχαμε 5 διεργασίες ((Σενάριο 3) Α.Σιδηρόπουλος
Αν είχαμε 5 διεργασίες (Σενάριο 3) Deadlock Μη αποδεκτή λύση Time Α.Σιδηρόπουλος
Για καλύτερη επιτάχυνση θα πρέπει να χρησιμοποιηθεί non-blocking Send & Receive Α.Σιδηρόπουλος
Αν είχαμε 5 διεργασίεςμε non-blocking (Σενάριο 4) Time Barrier Barrier Α.Σιδηρόπουλος
Μέθοδοι επικοινωνίας • Άλλες λύσεις ? Α.Σιδηρόπουλος
Αν είχαμε 5 διεργασίεςμε blocking (Σενάριο 5) Time Barrier Barrier Αντί όλες οι διεργασίες να κάνουν με την ίδια σειρά Send-Receive να το κάνουν εναλλάξ. Α.Σιδηρόπουλος
Αν είχαμε 5 διεργασίεςμε blocking (Σενάριο 5) Time Διαφορετική σειρά Send-Receive στις μονές-ζυγές διεργασίες. Οι μονές διεργασίες Receive-Send, οι ζυγές Send-Receive. Α.Σιδηρόπουλος
Επικοινωνία μεταξύ διεργασιών MPI_Reduce Global_Diff_sum Διεργασία 0 Diff_sum Διεργασία 1 Diff_sum Διεργασία 2 Diff_sum Με βάση το Global_Diff_sum η διεργασία 0 θα αποφασίσει αν τελειώσαμε. Θα θέσει την μεταβλητή ΟΚ και θα την κάνει Bcastσε όλες. Α.Σιδηρόπουλος
Συλλογή αποτελεσμάτων Διεργασία 0 Διεργασία 1 Διεργασία 2 Α.Σιδηρόπουλος
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] ) j=2 j=1 j=4 j=6 j=9 j=3 j=5 j=8 j=7 i=1 i=2 i−1,j−1 i−1,j+1 i−1,j i=3 i=4 i,j−1 i,j i,j+1 i=5 i+1,j−1 i+1,j i+1,j+1 i=6 i=7 i=8 i=9 Α.Σιδηρόπουλος