stathi02 Δημοσ. 24 Οκτωβρίου 2010 Δημοσ. 24 Οκτωβρίου 2010 Παιδιά καλημέρα, χρησιμοποιώ στη δουλειά μου Fortran και ολίγο Matlab. Έχω κάποια προγράμματα τα οποία είναι πολύ απαιτητικά (Global optimization) και θα ήθελα σιγά σιγά να τα κάνω να εκμεταλεύονται τα τελευταία PC (4 core). Χρησιμοποιώ Ιντελ compiler 10. Σε πρώτη φάση θα ήθελα μια γενική άποψη από κάποιον γνώστη. Ένα βιβλίο ή ebook για πρώτη φάση θα με ενδιέφερε (fortran & matlab). Ευχαριστώ
stathi02 Δημοσ. 24 Οκτωβρίου 2010 Μέλος Δημοσ. 24 Οκτωβρίου 2010 Παιδιά καλημέρα, χρησιμοποιώ στη δουλειά μου Fortran και ολίγο Matlab. Έχω κάποια προγράμματα τα οποία είναι πολύ απαιτητικά (Global optimization) και θα ήθελα σιγά σιγά να τα κάνω να εκμεταλεύονται τα τελευταία PC (4 core). Χρησιμοποιώ Ιντελ compiler 10. Σε πρώτη φάση θα ήθελα μια γενική άποψη από κάποιον γνώστη. Ένα βιβλίο ή ebook για πρώτη φάση θα με ενδιέφερε (fortran & matlab). Ευχαριστώ
V.I.Smirnov Δημοσ. 24 Οκτωβρίου 2010 Δημοσ. 24 Οκτωβρίου 2010 Για matlab θα σου πουν άλλοι. H Ιntel fortran όπως την έχεις μπορεί να κάνει τόσο αυτόματη παραλληλοποίηση όσο και με χρήση του openMP. Μπορεί επίσης να συνδυαστούν αμφότερα. Επίσης μπορεί επιπλέον να γίνει και vectorization. H αποτελεσματικότητα όλων αυτών εξαρτάται ισχυρά από το στυλ γραφής. Δεν ξέρω αν η intel fortran 10 υποστηρίζει το openMP 3 - πάντως η 11 το υποστηρίζει. Μιλώντας για την έκδοση 11, το help που έχει είναι πολύ κατατοπιστικό, με παραδείγματα για το πώς μπορεί να χρησιμοποιηθεί. Τutorial για το openMP υπάρχουν άφθονα, ένα καλό είναι εδώ : https://computing.llnl.gov/tutorials/openMP/#Abstract Βιβλία επίσης υπάρχουν - όχι πολλά αλλά αξίζουν. Αυτά που έχω διαβάσει εγώ είναι τα : "Using OpenMP Portable Shared Memory Parallel Programming" "Parallel Programming in OpenMP" Μπορείς να τα βρεις και ηλεκτρονικά τσάμπα αν ψάξεις. Εκ των ουκ ανευ είναι επίσης και το επίσημο site του openMP που περιγράφει το standard για fotran και C/C++ με παραδείγματα και λεπτομέρειες. Eπίσης, ο μπλε τόμος από το κλασσικό Numerical Recipes περιέχει όλες τις ρουτίνες αυτής της βιβλιοθήκης μετεγραμμένες στο εγγενές παράλληλο στυλ της fortran (ήδη από το '96). Στο πρώτο κεφάλαιο έχει και πολλές χρήσιμες υποδείξεις. Αυτό είναι κατάλληλο για εφαρμογή της αυτόματης παραλληλοποίησης. Από τα πιο χρήσιμα βιβλία εφαρμοσμένης αριθμητικής ανάλυσης. To κακό με το OpenMP 3 είναι ότι μερικά χρήσιμα χαρακτηριστικά του δεν υποστηρίζονται ακόμη από τους compilers παρόλο που τα ορίζει το πρότυπο. Π.χ. η εντολή workshare με την οποία οι πράξεις πινάκων όπως Α = Β + C (αλλά και όλες οι εντολές που δρουν σε πίνακες) θα έπρεπε να γίνονται παράλληλα, δεν υλοποιείται πραγματικά και η πράξη εκτελείται σειριακά - τουλάχιστον στον compiler της intel. Το ίδιο και οι εγγενείς εντολές της fortran forall και where : δεν τις παραλληλίζει ο compiler με το openMP. Στις περιπτώσεις αυτές μπορεί να χρησιμοποιηθεί αυτόματος παραλληλισμός και vectorization. Αν κοιτάξεις στο menu project->properties κλπ θα βρεις πώς ενεργοποιούνται και πώς δουλεύουν (καθώς επίσης και το help). Ένα θέμα υπάρχει επίσης με την φωλιασμένη (nested) παραλληλία. Για όλα αυτά φταίνε βέβαια οι compilers και όχι το πρότυπο. (Eν διαβάσει, επισημαίνεται ότι η workshare δεν ορίζεται για την C/C++ διότι εκεί δεν υποστηρίζονται εγγενώς πίνακες.) Ξαναλέω πάντως ότι οι επιδόσεις του ΟpenΜP (αλλά και της αυτόματης παραλληλίας) εξαρτώνται ισχυρά από το στυλ γραφής και οδηγίες επ' αυτού περιγράφονται στα βιβλία που πρότεινα πριν, ειδικά στο πρώτο. Τα tutorial στο διαδίκτυο δεν λένε τίποτε άλλο παρά απλή περιγραφή των εντολών που ΔΕΝ αρκεί. Άλλος τρόπος παραλληλοποίησης είναι με το MPI. Μπορεί να χρησιμοποιηθεί με την intel fortran, C++ καθώς και μέσα από το visual studio αλλά μάλλον δεν θα σου κάνει (το γιατί θα το δεις αν ασχοληθείς λίγο μαζί του). Αν επιμείνεις πάντως ξέρω να σου πω πώς θα ξεκινήσεις και μ' αυτό. Μάλιστα συνδυάζεται και με το OpenMP και αυτός ο συνδυασμός είναι της μόδας τα τελευταία χρόνια. Τα posix threads είναι μια εναλλακτική λύση (προσωπικά δεν τα έχω δοκιμάσει) αλλά μειονεκτούν στο ότι απαιτούν χειρισμό πολλών λεπτομερειών και χαμηλό επίπεδο γραφής. Τέλος υπάρχουν και βιβλιοθήκες όπως η ΤΒΒ της Intel που κάνουν παραλληλισμό με εύκολο τρόπο. Τα posix threads και η TBB είναι για γενικότερο παραλληλισμό (κυρίως παραλληλισμό ελέγχου) κι' όχι τόσο για scientific programming. Κλείνοντας, στο scientific programming ενδιαφέρει κυρίως ο παραλληλισμός δεδομένων (κι όχι ελέγχου) στον οποίο το openMP και οι δυνατότητες αυτόματης παραλληλίας της fortran είναι πολύ καλά προσαρμοσμένες και εύχρηστες. Στη fortran η καλύτερη επιλογή να ξεκινήσεις είναι μάλλον το openMP. -
V.I.Smirnov Δημοσ. 24 Οκτωβρίου 2010 Δημοσ. 24 Οκτωβρίου 2010 Για matlab θα σου πουν άλλοι. H Ιntel fortran όπως την έχεις μπορεί να κάνει τόσο αυτόματη παραλληλοποίηση όσο και με χρήση του openMP. Μπορεί επίσης να συνδυαστούν αμφότερα. Επίσης μπορεί επιπλέον να γίνει και vectorization. H αποτελεσματικότητα όλων αυτών εξαρτάται ισχυρά από το στυλ γραφής. Δεν ξέρω αν η intel fortran 10 υποστηρίζει το openMP 3 - πάντως η 11 το υποστηρίζει. Μιλώντας για την έκδοση 11, το help που έχει είναι πολύ κατατοπιστικό, με παραδείγματα για το πώς μπορεί να χρησιμοποιηθεί. Τutorial για το openMP υπάρχουν άφθονα, ένα καλό είναι εδώ : https://computing.llnl.gov/tutorials/openMP/#Abstract Βιβλία επίσης υπάρχουν - όχι πολλά αλλά αξίζουν. Αυτά που έχω διαβάσει εγώ είναι τα : "Using OpenMP Portable Shared Memory Parallel Programming" "Parallel Programming in OpenMP" Μπορείς να τα βρεις και ηλεκτρονικά τσάμπα αν ψάξεις. Εκ των ουκ ανευ είναι επίσης και το επίσημο site του openMP που περιγράφει το standard για fotran και C/C++ με παραδείγματα και λεπτομέρειες. Eπίσης, ο μπλε τόμος από το κλασσικό Numerical Recipes περιέχει όλες τις ρουτίνες αυτής της βιβλιοθήκης μετεγραμμένες στο εγγενές παράλληλο στυλ της fortran (ήδη από το '96). Στο πρώτο κεφάλαιο έχει και πολλές χρήσιμες υποδείξεις. Αυτό είναι κατάλληλο για εφαρμογή της αυτόματης παραλληλοποίησης. Από τα πιο χρήσιμα βιβλία εφαρμοσμένης αριθμητικής ανάλυσης. To κακό με το OpenMP 3 είναι ότι μερικά χρήσιμα χαρακτηριστικά του δεν υποστηρίζονται ακόμη από τους compilers παρόλο που τα ορίζει το πρότυπο. Π.χ. η εντολή workshare με την οποία οι πράξεις πινάκων όπως Α = Β + C (αλλά και όλες οι εντολές που δρουν σε πίνακες) θα έπρεπε να γίνονται παράλληλα, δεν υλοποιείται πραγματικά και η πράξη εκτελείται σειριακά - τουλάχιστον στον compiler της intel. Το ίδιο και οι εγγενείς εντολές της fortran forall και where : δεν τις παραλληλίζει ο compiler με το openMP. Στις περιπτώσεις αυτές μπορεί να χρησιμοποιηθεί αυτόματος παραλληλισμός και vectorization. Αν κοιτάξεις στο menu project->properties κλπ θα βρεις πώς ενεργοποιούνται και πώς δουλεύουν (καθώς επίσης και το help). Ένα θέμα υπάρχει επίσης με την φωλιασμένη (nested) παραλληλία. Για όλα αυτά φταίνε βέβαια οι compilers και όχι το πρότυπο. (Eν διαβάσει, επισημαίνεται ότι η workshare δεν ορίζεται για την C/C++ διότι εκεί δεν υποστηρίζονται εγγενώς πίνακες.) Ξαναλέω πάντως ότι οι επιδόσεις του ΟpenΜP (αλλά και της αυτόματης παραλληλίας) εξαρτώνται ισχυρά από το στυλ γραφής και οδηγίες επ' αυτού περιγράφονται στα βιβλία που πρότεινα πριν, ειδικά στο πρώτο. Τα tutorial στο διαδίκτυο δεν λένε τίποτε άλλο παρά απλή περιγραφή των εντολών που ΔΕΝ αρκεί. Άλλος τρόπος παραλληλοποίησης είναι με το MPI. Μπορεί να χρησιμοποιηθεί με την intel fortran, C++ καθώς και μέσα από το visual studio αλλά μάλλον δεν θα σου κάνει (το γιατί θα το δεις αν ασχοληθείς λίγο μαζί του). Αν επιμείνεις πάντως ξέρω να σου πω πώς θα ξεκινήσεις και μ' αυτό. Μάλιστα συνδυάζεται και με το OpenMP και αυτός ο συνδυασμός είναι της μόδας τα τελευταία χρόνια. Τα posix threads είναι μια εναλλακτική λύση (προσωπικά δεν τα έχω δοκιμάσει) αλλά μειονεκτούν στο ότι απαιτούν χειρισμό πολλών λεπτομερειών και χαμηλό επίπεδο γραφής. Τέλος υπάρχουν και βιβλιοθήκες όπως η ΤΒΒ της Intel που κάνουν παραλληλισμό με εύκολο τρόπο. Τα posix threads και η TBB είναι για γενικότερο παραλληλισμό (κυρίως παραλληλισμό ελέγχου) κι' όχι τόσο για scientific programming. Κλείνοντας, στο scientific programming ενδιαφέρει κυρίως ο παραλληλισμός δεδομένων (κι όχι ελέγχου) στον οποίο το openMP και οι δυνατότητες αυτόματης παραλληλίας της fortran είναι πολύ καλά προσαρμοσμένες και εύχρηστες. Στη fortran η καλύτερη επιλογή να ξεκινήσεις είναι μάλλον το openMP. -
stathi02 Δημοσ. 24 Οκτωβρίου 2010 Μέλος Δημοσ. 24 Οκτωβρίου 2010 V.I. Smirnof ευχαριστώ πολύ για τη γρήγορη απάντηση. Και εγώ νομίζω ότι πρεπει να ξεκινήσω με OpenMp. To θέμα είναι ότι ακόμα δεν μου χρειάζεται 100% αλλά βλέπω ότι το μέλλον πάει προς τα εκεί (αν οχι το παρόν). Ευχαριστώ πολύ θα τα κοιτάξω και θα απαντήσω αυριο.
stathi02 Δημοσ. 24 Οκτωβρίου 2010 Μέλος Δημοσ. 24 Οκτωβρίου 2010 V.I. Smirnof ευχαριστώ πολύ για τη γρήγορη απάντηση. Και εγώ νομίζω ότι πρεπει να ξεκινήσω με OpenMp. To θέμα είναι ότι ακόμα δεν μου χρειάζεται 100% αλλά βλέπω ότι το μέλλον πάει προς τα εκεί (αν οχι το παρόν). Ευχαριστώ πολύ θα τα κοιτάξω και θα απαντήσω αυριο.
V.I.Smirnov Δημοσ. 24 Οκτωβρίου 2010 Δημοσ. 24 Οκτωβρίου 2010 Θέλω να σου πω και τα εξής : Η cuda περί της οποίας πολλά ακούγονται τελευταία έχει κάποια σημαντικά μειονεκτήματα. 1) Δεν κάνει γενικά πράξεις σε διπλή ακρίβεια (που είναι το default σε scientific programming) παρά σε λίγες εκδόσεις καρτών. 2) Δεν μπορεί να χειριστεί προβλήματα με μεγάλες απαιτήσεις σε μνήμη : πέραν από 4 GB τα πράγματα δυσκολεύουν διότι η μνήμη της κάρτας δεν επαρκεί και πρέπει να γραφεί ο κώδικας με τρόπο που να λύνει το πρόβλημα τμηματικά ή να μεταφέρει τα δεδομένα στην μνήμη - δηλαδή μπελάς ! 3) Δεν επιτρέπει παραλληλισμό ελέγχου παρά σε στοιχειώδη βαθμό. Αυτό δένει τα χέρια αν έχεις κάτι πολύπλοκο. Π.χ. αν ένα τμήμα κώδικα έχει πολλά if-then ΔΕΝ παραλληλίζεται με cuda. Δεν έχω ασχοληθεί με cuda αλλά μέχρι να αρθούν το 2) και κυρίως το 3) για μένα δεν είναι κατάλληλη. Παραλληλισμός ελέγχου επιτυγχάνεται πλέον στο openMP με την εντολή task και takswait που εισήχθη στο openΜP 3. Πρέπει να βάλεις όμως την intel fortran 11. Και τονίζω ότι η αποτελεσματικότητα του openMP εξαρτάται από τον τρόπο γραφής. Το ότι το MPI κλιμακώνει καλύτερα ΔΕΝ είναι σωστό. Το σωστό είναι ότι οι παράγοντες που επηρεάζουν την κλιμάκωση στο openMP είναι περισσότεροι και ελέγχονται δυσκολότερα. Τό πρώτο από τα βιβλία που σου σύστησα εξηγεί καλά πολλές κακοτοπιές που είναι σημαντικές και δεν θα τις βρεις στα tutorial του διαδικτύου - απ' όσο θυμάμαι τουλάχιστον όταν έψαχνα πριν τρία χρόνια... Eξάλλου, αν γράφεις ότι αφορά (ή μπορεί να αφορά) πίνακες....πινακοειδώς τότε η αυτόματη παραλληλία θα βοηθήσει σημαντικά και τώρα. Π.χ. είναι λάθος να χρησιμοποιείς βρόχο για να κάνεις πράξεις όπως C=A-B κλπ. Πρέπει να γίνονται με τον συμβολισμό πινάκων. Στο menu project -->properties--> configuration properties--> fortran--> optimization έχει την επιλογή parallelization. Άνοιξέ την. Στο menu project -->properties--> configuration properties--> fortran--> diagnostics έχει τις επιλογές auto parallelizer diagnostic level και vectorizer diagnostic level. Άλλαξέ τες (βάλε κάτι άλλο εκτός από το default) για να βλέπεις τι παραλληλίζει αυτόματα από αυτά που έγραψες. Και για να μην ψάχνεις, το flag για το openMP είναι στο project -->properties--> configuration properties--> fortran--> language-->process openMP directives Eπίσης πρέπει να είναι ανοικτό και το flag project -->properties--> configuration properties--> fortran--> preprocessor-->openmp conditional compilation Επιπλέον, για scientifc programming είναι αξιοσημείωτες κάποιες βιβλιοθήκες που έχουν βελτιστοποιηθεί μεγίστως για παράλληλη επεξεργασία. Τέτοιες είναι οι κλασικές Lapack, ScaLapack κ.α. Εγώ κάποτε δοκίμασα την MKL που είναι της ίδιας της intel και υπερσύνολο της Lapack. Τέλος, τα openMP, ΜPI, posix threads είναι standards και cross platform και τρέχουν παντού (το mpi σε clusters). Aντίθετα, άλλα ματζούνια δεν είναι βέβαιο ότι θα λειτουργήσουν αν το μηχάνημα που τρέξεις το τελικό exe δεν έχει εγκατεστημένα πρόσθετα. Καλή συνέχεια... -
V.I.Smirnov Δημοσ. 24 Οκτωβρίου 2010 Δημοσ. 24 Οκτωβρίου 2010 Θέλω να σου πω και τα εξής : Η cuda περί της οποίας πολλά ακούγονται τελευταία έχει κάποια σημαντικά μειονεκτήματα. 1) Δεν κάνει γενικά πράξεις σε διπλή ακρίβεια (που είναι το default σε scientific programming) παρά σε λίγες εκδόσεις καρτών. 2) Δεν μπορεί να χειριστεί προβλήματα με μεγάλες απαιτήσεις σε μνήμη : πέραν από 4 GB τα πράγματα δυσκολεύουν διότι η μνήμη της κάρτας δεν επαρκεί και πρέπει να γραφεί ο κώδικας με τρόπο που να λύνει το πρόβλημα τμηματικά ή να μεταφέρει τα δεδομένα στην μνήμη - δηλαδή μπελάς ! 3) Δεν επιτρέπει παραλληλισμό ελέγχου παρά σε στοιχειώδη βαθμό. Αυτό δένει τα χέρια αν έχεις κάτι πολύπλοκο. Π.χ. αν ένα τμήμα κώδικα έχει πολλά if-then ΔΕΝ παραλληλίζεται με cuda. Δεν έχω ασχοληθεί με cuda αλλά μέχρι να αρθούν το 2) και κυρίως το 3) για μένα δεν είναι κατάλληλη. Παραλληλισμός ελέγχου επιτυγχάνεται πλέον στο openMP με την εντολή task και takswait που εισήχθη στο openΜP 3. Πρέπει να βάλεις όμως την intel fortran 11. Και τονίζω ότι η αποτελεσματικότητα του openMP εξαρτάται από τον τρόπο γραφής. Το ότι το MPI κλιμακώνει καλύτερα ΔΕΝ είναι σωστό. Το σωστό είναι ότι οι παράγοντες που επηρεάζουν την κλιμάκωση στο openMP είναι περισσότεροι και ελέγχονται δυσκολότερα. Τό πρώτο από τα βιβλία που σου σύστησα εξηγεί καλά πολλές κακοτοπιές που είναι σημαντικές και δεν θα τις βρεις στα tutorial του διαδικτύου - απ' όσο θυμάμαι τουλάχιστον όταν έψαχνα πριν τρία χρόνια... Eξάλλου, αν γράφεις ότι αφορά (ή μπορεί να αφορά) πίνακες....πινακοειδώς τότε η αυτόματη παραλληλία θα βοηθήσει σημαντικά και τώρα. Π.χ. είναι λάθος να χρησιμοποιείς βρόχο για να κάνεις πράξεις όπως C=A-B κλπ. Πρέπει να γίνονται με τον συμβολισμό πινάκων. Στο menu project -->properties--> configuration properties--> fortran--> optimization έχει την επιλογή parallelization. Άνοιξέ την. Στο menu project -->properties--> configuration properties--> fortran--> diagnostics έχει τις επιλογές auto parallelizer diagnostic level και vectorizer diagnostic level. Άλλαξέ τες (βάλε κάτι άλλο εκτός από το default) για να βλέπεις τι παραλληλίζει αυτόματα από αυτά που έγραψες. Και για να μην ψάχνεις, το flag για το openMP είναι στο project -->properties--> configuration properties--> fortran--> language-->process openMP directives Eπίσης πρέπει να είναι ανοικτό και το flag project -->properties--> configuration properties--> fortran--> preprocessor-->openmp conditional compilation Επιπλέον, για scientifc programming είναι αξιοσημείωτες κάποιες βιβλιοθήκες που έχουν βελτιστοποιηθεί μεγίστως για παράλληλη επεξεργασία. Τέτοιες είναι οι κλασικές Lapack, ScaLapack κ.α. Εγώ κάποτε δοκίμασα την MKL που είναι της ίδιας της intel και υπερσύνολο της Lapack. Τέλος, τα openMP, ΜPI, posix threads είναι standards και cross platform και τρέχουν παντού (το mpi σε clusters). Aντίθετα, άλλα ματζούνια δεν είναι βέβαιο ότι θα λειτουργήσουν αν το μηχάνημα που τρέξεις το τελικό exe δεν έχει εγκατεστημένα πρόσθετα. Καλή συνέχεια... -
Dr.Fuzzy Δημοσ. 24 Οκτωβρίου 2010 Δημοσ. 24 Οκτωβρίου 2010 Για OpenMP o V.I.Smirnov ήταν πολύ κατατοπιστικός οπότε δεν χρειάζεται να συμπληρώσω κάτι. Τώρα, αν σε ενδιαφέρει να δουλέψεις με το το MATLAB, μπορείς, 1. Να κάνεις compile OpenMP και C σε ΜΕΧ 2. Να χρησιμοποιήσεις το Parallel Computing Toolbox 3. Να χρησιμοποιήσεις MATLAB με CUDA.
Dr.Fuzzy Δημοσ. 24 Οκτωβρίου 2010 Δημοσ. 24 Οκτωβρίου 2010 Για OpenMP o V.I.Smirnov ήταν πολύ κατατοπιστικός οπότε δεν χρειάζεται να συμπληρώσω κάτι. Τώρα, αν σε ενδιαφέρει να δουλέψεις με το το MATLAB, μπορείς, 1. Να κάνεις compile OpenMP και C σε ΜΕΧ 2. Να χρησιμοποιήσεις το Parallel Computing Toolbox 3. Να χρησιμοποιήσεις MATLAB με CUDA.
dop Δημοσ. 24 Οκτωβρίου 2010 Δημοσ. 24 Οκτωβρίου 2010 Πρώτα από όλα πρέπει να βρεις το το bottleneck σου - το να περάσεις σε έναν παράλληλο αλγόριθμο για να πάρεις 4x speedup από ένα κομμάτι μόνον του προγράμματός σου δεν αρκεί. Για να πειστείς, δες τον Νόμο του Amdahl (http://en.wikipedia.org/wiki/Amdahl's_law). Επιπλέον, πρέπει και ο αλγόριθμός σου να είναι κατάλληλος για παραλληλισμό - όλοι οι αλγόριθμοι ΔΕ μπορούν να γίνουν παράλληλοι. Εφόσον δουλεύεις με fortran έχεις 3 επιλογές για παραλληλισμό: έναν auto-parallelizing compiler, OpenMP και MPI. Όλοι οι τρόποι έχουν κοινά τρικ για να πετύχεις μέγιστη απόδοση: προσπαθείς να έχεις όσο το δυνατόν περισσότερες local μεταβλητές, τα loop σου να κάνουν όσο το δυνατόν περισσότερη δουλεία στο κυρίως μέρος, να αποφεύγεις data dependencies μέσα στα loops και τέλος να έχεις όσο το δύνατόν πιο sequential memory access pattern. Μπορείς να κοιτάξεις τα http://cnx.org/content/m33738/latest/ , http://blog.feradz.com/2009/01/cache-efficient-matrix-multiplication/ και http://www.mcs.anl.gov/~itf/dbpp/text/node45.html που να αναφέρονται σε matrix multiplication. Όταν καταλάβεις γιατί και πώς δουλεύουν, είσαι σε καλό δρόμο. Για να αφήσεις τον compiler να κάνει τη δουλειά σου, του δίνεις -parallel και θα προσπαθήσει να παραλληλίσει ό,τι μπορεί. Υπάρχει και κάποιο επιπλέον flag για να σου λέει και γιατί δε μπορεί να παραλληλίσει κάτι αλλά μου διαφεύγει αυτή τη στιγμή - κοίταξε το manual του compiler σου. Όσον αφορά το OpenMP, είναι κατάλληλο μόνον για shared-memory multiprocessors, οπότε είσαι εντάξει με τα multicores. Υποθέτω ότι ο κώδικας χρησιμοποιεί κατά κόρον matrices, οπότε το OpenMP 2.5 σου είναι υπεραρκετό. Καλά βιβλία είναι το "Using OpenMP: Portable Shared Memory Parallel Programming" ( http://www.amazon.com/Using-OpenMP-Programming-Engineering-Computation/dp/0262533022/ref=pd_sim_b_1 ) που προαναφέρθηκε και το (σε περίπτωση που ξέρεις λίγη C) "Parallel Programming in C with MPI and OpenMP" ( http://www.amazon.com/Parallel-Programming-C-MPI-OpenMP/dp/0071232656/ref=pd_sim_b_6 ) που παρουσιάζει OpenMP και MPI. Ό,τι αναφέρεται για C ισχύει και στη Fortran λίγο πολύ. To MPI είναι ένα API specification για message passing από process σε process. Είναι κατάλληλο για clusters και multicores, αλλά λίγο πιο δύσκολο από το OpenMP. Προτείνω το "Using MPI - 2nd Edition: Portable Parallel Programming with the Message Passing Interface" ( http://www.amazon.com/Using-MPI-Programming-Engineering-Computation/dp/0262571323/ref=pd_sim_b_9 ). Μερικές φορές, αντίθετα από την γενική αντίληψη, κώδικας γραμμένος με MPI ξεπερνά σε απόδοση το OpenMP. Τα POSIX threads απέφυγέ τα εκτός και αν θέλεις να γράψεις το δικό σου runtime system - που δε στο συνιστώ, εκτός και αν είναι η δουλειά σου. Το TBB ταιριάζει στα πάντα (και ναι, είναι κατάλληλο για επιστημονικό υπολογισμό, αντίθετα με τους παραπάνω ισχυρισμούς) αλλά είναι μόνον για C++, άρα δε σου κάνει. Ό,τι μπορείς να κάνεις στο OpenMP μπορείς και στο TBB. Ό,τι κάνεις στο TBB δεν γίνεται απαραίτητα στο OpenMP. Αν δεν έχεις περιορισμούς σε compiler/βιβλιοθήκες μπορείς να κοιτάξεις τα coarrays ( http://en.wikipedia.org/wiki/Co-array_Fortran ) και την Intel MKL ( http://software.intel.com/en-us/intel-mkl/ ) όπως προαναφέρθηκε. Το πρώτο είναι ένα απλό API extension για Fortran που παρέχει κάποιον εγγενή παραλληλισμό, το δεύτερο μια βιβλιόθηκη με μαθηματικές ρουτίνες, βελτιστοποιημένες για x86.
dop Δημοσ. 24 Οκτωβρίου 2010 Δημοσ. 24 Οκτωβρίου 2010 Πρώτα από όλα πρέπει να βρεις το το bottleneck σου - το να περάσεις σε έναν παράλληλο αλγόριθμο για να πάρεις 4x speedup από ένα κομμάτι μόνον του προγράμματός σου δεν αρκεί. Για να πειστείς, δες τον Νόμο του Amdahl (http://en.wikipedia.org/wiki/Amdahl's_law). Επιπλέον, πρέπει και ο αλγόριθμός σου να είναι κατάλληλος για παραλληλισμό - όλοι οι αλγόριθμοι ΔΕ μπορούν να γίνουν παράλληλοι. Εφόσον δουλεύεις με fortran έχεις 3 επιλογές για παραλληλισμό: έναν auto-parallelizing compiler, OpenMP και MPI. Όλοι οι τρόποι έχουν κοινά τρικ για να πετύχεις μέγιστη απόδοση: προσπαθείς να έχεις όσο το δυνατόν περισσότερες local μεταβλητές, τα loop σου να κάνουν όσο το δυνατόν περισσότερη δουλεία στο κυρίως μέρος, να αποφεύγεις data dependencies μέσα στα loops και τέλος να έχεις όσο το δύνατόν πιο sequential memory access pattern. Μπορείς να κοιτάξεις τα http://cnx.org/content/m33738/latest/ , http://blog.feradz.com/2009/01/cache-efficient-matrix-multiplication/ και http://www.mcs.anl.gov/~itf/dbpp/text/node45.html που να αναφέρονται σε matrix multiplication. Όταν καταλάβεις γιατί και πώς δουλεύουν, είσαι σε καλό δρόμο. Για να αφήσεις τον compiler να κάνει τη δουλειά σου, του δίνεις -parallel και θα προσπαθήσει να παραλληλίσει ό,τι μπορεί. Υπάρχει και κάποιο επιπλέον flag για να σου λέει και γιατί δε μπορεί να παραλληλίσει κάτι αλλά μου διαφεύγει αυτή τη στιγμή - κοίταξε το manual του compiler σου. Όσον αφορά το OpenMP, είναι κατάλληλο μόνον για shared-memory multiprocessors, οπότε είσαι εντάξει με τα multicores. Υποθέτω ότι ο κώδικας χρησιμοποιεί κατά κόρον matrices, οπότε το OpenMP 2.5 σου είναι υπεραρκετό. Καλά βιβλία είναι το "Using OpenMP: Portable Shared Memory Parallel Programming" ( http://www.amazon.com/Using-OpenMP-Programming-Engineering-Computation/dp/0262533022/ref=pd_sim_b_1 ) που προαναφέρθηκε και το (σε περίπτωση που ξέρεις λίγη C) "Parallel Programming in C with MPI and OpenMP" ( http://www.amazon.com/Parallel-Programming-C-MPI-OpenMP/dp/0071232656/ref=pd_sim_b_6 ) που παρουσιάζει OpenMP και MPI. Ό,τι αναφέρεται για C ισχύει και στη Fortran λίγο πολύ. To MPI είναι ένα API specification για message passing από process σε process. Είναι κατάλληλο για clusters και multicores, αλλά λίγο πιο δύσκολο από το OpenMP. Προτείνω το "Using MPI - 2nd Edition: Portable Parallel Programming with the Message Passing Interface" ( http://www.amazon.com/Using-MPI-Programming-Engineering-Computation/dp/0262571323/ref=pd_sim_b_9 ). Μερικές φορές, αντίθετα από την γενική αντίληψη, κώδικας γραμμένος με MPI ξεπερνά σε απόδοση το OpenMP. Τα POSIX threads απέφυγέ τα εκτός και αν θέλεις να γράψεις το δικό σου runtime system - που δε στο συνιστώ, εκτός και αν είναι η δουλειά σου. Το TBB ταιριάζει στα πάντα (και ναι, είναι κατάλληλο για επιστημονικό υπολογισμό, αντίθετα με τους παραπάνω ισχυρισμούς) αλλά είναι μόνον για C++, άρα δε σου κάνει. Ό,τι μπορείς να κάνεις στο OpenMP μπορείς και στο TBB. Ό,τι κάνεις στο TBB δεν γίνεται απαραίτητα στο OpenMP. Αν δεν έχεις περιορισμούς σε compiler/βιβλιοθήκες μπορείς να κοιτάξεις τα coarrays ( http://en.wikipedia.org/wiki/Co-array_Fortran ) και την Intel MKL ( http://software.intel.com/en-us/intel-mkl/ ) όπως προαναφέρθηκε. Το πρώτο είναι ένα απλό API extension για Fortran που παρέχει κάποιον εγγενή παραλληλισμό, το δεύτερο μια βιβλιόθηκη με μαθηματικές ρουτίνες, βελτιστοποιημένες για x86.
V.I.Smirnov Δημοσ. 24 Οκτωβρίου 2010 Δημοσ. 24 Οκτωβρίου 2010 Πρώτα από όλα πρέπει να βρεις το το bottleneck σου - το να περάσεις σε έναν παράλληλο αλγόριθμο για να πάρεις 4x speedup από ένα κομμάτι μόνον του προγράμματός σου δεν αρκεί. Για να πειστείς, δες τον Νόμο του Amdahl. Επιπλέον, πρέπει και ο αλγόριθμός σου να είναι κατάλληλος για παραλληλισμό - όλοι οι αλγόριθμοι ΔΕ μπορούν να γίνουν παράλληλοι. Υπάρχουν εργαλεία που κάνουν αυτή την δουλειά σε μικρομετρικό επίπεδο. Π.χ. το analyzer της ίδιας της intel. Αλλά εγώ δεν τα χρησιμοποίησα διότι δεν ήταν συμβατά με την έκδοση του compiler που είχα (τα είχα βρει κλεψιμέικα). To MPI είναι ένα API specification για message passing από process σε process. Είναι κατάλληλο για clusters και multicores, αλλά λίγο πιο δύσκολο από το OpenMP. Προτείνω το "Using MPI - 2nd Edition: Portable Parallel Programming with the Message Passing Interface". Μερικές φορές, αντίθετα από την γενική αντίληψη, κώδικας γραμμένος με MPI ξεπερνά σε απόδοση το OpenMP. Όχι απλώς πιο δύσκολο, ΠΟΛΥ πιο δύσκολο. Και συμβαίνει το αντίθετο απ' ότι λες : το MPI γενικά κλιμακώνει καλύτερα κι' όχι το openMP. Σε αυτό δεν φταίει όμως τόσο το openMP όσο ο τρόπος γραφής του προγράμματος όπως ηδη είπα 3 φορές. Τα βιβλία που σύστησα εξηγούν τους λόγους. Για μηχανήματα desktop όπως αυτά που χρησιμοποιούμε καθημερινά και για γραφή σύνηθων προγραμμάτων το MPI είναι ακατάλληλο για πολλούς λόγους. Μακριά..... Το TBB ταιριάζει στα πάντα (και ναι, είναι κατάλληλο για επιστημονικό υπολογισμό, αντίθετα με τους παραπάνω ισχυρισμούς)αλλά είναι μόνον για C++, άρα δε σου κάνει. Ό,τι μπορείς να κάνεις στο OpenMP μπορείς και στο TBB. Ό,τι κάνεις στο TBB δεν γίνεται απαραίτητα στο OpenMP. Ίσως έχεις δίκιο για τα TBB. Εγώ το ξέρω σαν όνομα αλλά δεν το έχω ασχοληθεί. Δεν ξέρω όμως κατά πόσον είναι standard σαν τις άλλες επιλογές. Για τα υπόλοιπα που αναφέρεις, ήδη σε πρόλαβα....
V.I.Smirnov Δημοσ. 24 Οκτωβρίου 2010 Δημοσ. 24 Οκτωβρίου 2010 Πρώτα από όλα πρέπει να βρεις το το bottleneck σου - το να περάσεις σε έναν παράλληλο αλγόριθμο για να πάρεις 4x speedup από ένα κομμάτι μόνον του προγράμματός σου δεν αρκεί. Για να πειστείς, δες τον Νόμο του Amdahl. Επιπλέον, πρέπει και ο αλγόριθμός σου να είναι κατάλληλος για παραλληλισμό - όλοι οι αλγόριθμοι ΔΕ μπορούν να γίνουν παράλληλοι. Υπάρχουν εργαλεία που κάνουν αυτή την δουλειά σε μικρομετρικό επίπεδο. Π.χ. το analyzer της ίδιας της intel. Αλλά εγώ δεν τα χρησιμοποίησα διότι δεν ήταν συμβατά με την έκδοση του compiler που είχα (τα είχα βρει κλεψιμέικα). To MPI είναι ένα API specification για message passing από process σε process. Είναι κατάλληλο για clusters και multicores, αλλά λίγο πιο δύσκολο από το OpenMP. Προτείνω το "Using MPI - 2nd Edition: Portable Parallel Programming with the Message Passing Interface". Μερικές φορές, αντίθετα από την γενική αντίληψη, κώδικας γραμμένος με MPI ξεπερνά σε απόδοση το OpenMP. Όχι απλώς πιο δύσκολο, ΠΟΛΥ πιο δύσκολο. Και συμβαίνει το αντίθετο απ' ότι λες : το MPI γενικά κλιμακώνει καλύτερα κι' όχι το openMP. Σε αυτό δεν φταίει όμως τόσο το openMP όσο ο τρόπος γραφής του προγράμματος όπως ηδη είπα 3 φορές. Τα βιβλία που σύστησα εξηγούν τους λόγους. Για μηχανήματα desktop όπως αυτά που χρησιμοποιούμε καθημερινά και για γραφή σύνηθων προγραμμάτων το MPI είναι ακατάλληλο για πολλούς λόγους. Μακριά..... Το TBB ταιριάζει στα πάντα (και ναι, είναι κατάλληλο για επιστημονικό υπολογισμό, αντίθετα με τους παραπάνω ισχυρισμούς)αλλά είναι μόνον για C++, άρα δε σου κάνει. Ό,τι μπορείς να κάνεις στο OpenMP μπορείς και στο TBB. Ό,τι κάνεις στο TBB δεν γίνεται απαραίτητα στο OpenMP. Ίσως έχεις δίκιο για τα TBB. Εγώ το ξέρω σαν όνομα αλλά δεν το έχω ασχοληθεί. Δεν ξέρω όμως κατά πόσον είναι standard σαν τις άλλες επιλογές. Για τα υπόλοιπα που αναφέρεις, ήδη σε πρόλαβα....
dop Δημοσ. 25 Οκτωβρίου 2010 Δημοσ. 25 Οκτωβρίου 2010 Υπάρχουν εργαλεία που κάνουν αυτή την δουλειά σε μικρομετρικό επίπεδο. Π.χ. το analyzer της ίδιας της intel.Αλλά εγώ δεν τα χρησιμοποίησα διότι δεν ήταν συμβατά με την έκδοση του compiler που είχα (τα είχα βρει κλεψιμέικα). Δε χρειάζεται εργαλεία - ένας απλός timer κάνει. Τα εργαλεία θα παράξουν πολύ περισσότερες πληροφορίες από όσες χρειάζεται για να κάνει identify το bottleneck σε τόσο αρχικά στάδια. Όχι απλώς πιο δύσκολο, ΠΟΛΥ πιο δύσκολο. Και συμβαίνει το αντίθετο απ' ότι λες :το MPI γενικά κλιμακώνει καλύτερα κι' όχι το openMP. Σε αυτό δεν φταίει όμως τόσο το openMP όσο ο τρόπος γραφής του προγράμματος όπως ηδη είπα 3 φορές. Τα βιβλία που σύστησα εξηγούν τους λόγους. Για μηχανήματα desktop όπως αυτά που χρησιμοποιούμε καθημερινά και για γραφή σύνηθων προγραμμάτων το MPI είναι ακατάλληλο για πολλούς λόγους. Μακριά..... Δεν είναι "ΠΟΛΥ πιο δύσκολο", απλά είναι διαφορετικό. Στο κάτω-κάτω είναι μια βιβλιοθήκη για ανταλλαγή μηνυμάτων. Εντάξει, δεν το έκανες και στο δημοτικό, αλλά δεν είναι και rocket science. Άμα θέλεις επιδόσεις, θα δεις και το OpenMP και το MPI και όλα. Η κοινή λογική λέει ότι το να παραλληλίσεις κώδικα με threads (OpenMP) θα είναι πιο γρήγορο από το να το κάνεις με processes (MPI) λόγω λιγότερης καταναλισκούμενης μνήμης και memory sharing. Η σχετική βιβλιογραφία για hybrid OpenMP + MPI programming θα σε πείσει. Η πράξη διαφέρει στο γεγονός ότι το MPI σε κάνει να σκεφτείς λίγο περισσότερο για το data locality και να αποφύγεις όσο το δυνατόν τις shared μεταβλητές (που για το MPI χρειάζεται να κουβαλάς δεξιά και αριστερά τις τιμές, υλοποιώντας ένα είδος software cache coherency). Περισσότερα accesses σε shared variables σημαίνει περισσότερα cache line invalidations, μεγαλύτερο bandwidth consumption στο bus και άρα χειρότερες επιδόσεις. Ο ίδιος ακριβώς κώδικας σε MPI και OpenMP (άμα δηλαδή γράφεις OpenMP κάνοντας αντιγραφή ότι μεταβλητής χρησιμοποιείς) έχει την ίδια απόδοση με μικρότερο memory footprint. Όμως, αν σήμερα το MPI ξεπερνά το OpenMP σε επιδόσεις, αυτό δε σημαίνει ότι θα γίνει και αύριο: όσο οι compilers γίνονται πιο "έξυπνοι", τόσο γέρνει η πλάστιγγα προς τη μεριά του OpenMP, καθώς με το OpenMP ο compiler μπορεί να κάνει περισσότερα optimizations. Ίσως έχεις δίκιο για τα TBB. Εγώ το ξέρω σαν όνομα αλλά δεν το έχω ασχοληθεί. Δεν ξέρω όμως κατά πόσον είναι standard σαν τις άλλες επιλογές. Για τα υπόλοιπα που αναφέρεις, ήδη σε πρόλαβα.... Οτιδήποτε εκφράζεται με data parallelism, μπορείς να το εκφράσεις με task parallelism - απλά ο γράφος των εξαρτήσεων των tasks είναι ένα one-level tree. Το task parallelism είναι αρκετά πιο abstract από το data. Για την ιστορία, ούτε το MPI είναι standard ακριβώς - ό,τι θέλει υλοποιεί ο κάθε vendor. ΥΓ ένα καλό tutorial που βρήκα για την έκδοση 9 είναι στο http://www.ncsa.illinois.edu/UserInfo/Resources/Software/Intel/Compilers/9.0/training/optimize/index.htm Κάπου θα υπάρχει και για την 10 (ίσως στην Intel ή σε κάποιο από τα CD). ΥΓ2 όχι, δε με πρόλαβες, μας πρόλαβαν και τους δύο ο William Gropp, η Barbara Chapman και άλλοι πολλοί. Και εκτός των άλλων, σημείωσα ότι προαναφέρθηκαν.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.