deesnider Δημοσ. 21 Μαρτίου 2013 Δημοσ. 21 Μαρτίου 2013 Παιδιά, θέλω να ρωτήσω όποιον γνωρίζει, για κάτι που μου έχει κινήσει το - εγκυκλοπαιδικό - ενδιαφέρον και για το οποίο, παρά το σχετικό ψάξιμο που έκανα, μου έμειναν κάποια βασικά κενά. Διαβάζω περί τεχνολογίας CUDA τής Nvidia σε κάποιες σειρές καρτών γραφικών. Αν έχω καταλάβει σωστά, εφόσον το software υποστηρίζει το συγκεκριμένο χαρακτηριστικό, υπάρχει η δυνατότητα να «αναλάβει» η κάρτα γραφικών το φόρτο εργασίας π.χ. κατά την επεξεργασία video ή εικόνας, αποδεσμεύοντας τη CPU από αυτή τη δουλειά και, πολλές φορές να επιταχύνει αισθητά την επεξεργασία. Η ερώτηση είναι η εξής (εφόσον τα παραπάνω είναι αληθή) : Η συγκεκριμένη τεχνολογία, λειτουργεί ανεξάρτητα και δε σχετίζεται καθόλου με τη γενιά, ή την ισχύ τής CPU; Με άλλα λόγια, αν έχεις ένα σχετικά παρωχημένο επεξεργαστή, ο οποίος για την ολοκλήρωση μιας συγκεκριμένης διεργασίας χρειάζεται π.χ. 30 λεπτά, τοποθετώντας μια κάρτα γραφικών με CUDA CORES, η «δουλειά» γίνεται ταχύτερα;
tmjuju Δημοσ. 22 Μαρτίου 2013 Δημοσ. 22 Μαρτίου 2013 Υπάρχει μια κατηγορία ‘μαθηματικών προβλημάτων’ που μπορεί να επιταχυνθεί κατά πολύ εάν χρησιμοποιήσουμε την κάρτα γραφικών. Σκέψου πράξεις με μεγάλους πινάκες. Οι κάρτες γραφικών στην ουσία έχουν μέσα τους εκατοντάδες μικρούς πύρινες που μπορούν να εκτελέσουν μαθηματικές πράξεις παράλληλα. Δεν είναι όλα τα μαθηματικά προβλήματα αυτού του τύπου, ούτε όλες οι εφαρμογές desktop etc. Για γενική χρήση και σε πολλά άλλα προβλήματα ή εφαρμογές ένας επεξεργαστής (γενικής χρήσης – CPU) είναι πιο βολικός και γρήγορος. Άρα προσθέτοντας μια κάρτα γραφικών δεν σημαίνει ότι υποκαθιστάς τον κεντρικό επεξεργαστή – μονό σε ειδικές περιπτώσεις μπορείς να χρησιμοποιήσεις την κάρτα γραφικών για ‘επιτάχυνση’. Πέραν της cuda υπάρχει επίσης και το ανοιχτό πρότυπο OpenCL και το πρότυπο της MS DirectCompute. 1
Waldo_Vrs Δημοσ. 22 Μαρτίου 2013 Δημοσ. 22 Μαρτίου 2013 Το να δουλέψει και η GPU σαν βοήθημα δεν θα λειτουργήσει εφόσον το υποστηρίζει το πρόγραμμα που τρέχεις...δηλαδή μόνο σε περιπτώσεις video επεξεργασίας και rendering? και όχι γενικά?
cyberrobot Δημοσ. 22 Μαρτίου 2013 Δημοσ. 22 Μαρτίου 2013 Η ερώτηση είναι η εξής (εφόσον τα παραπάνω είναι αληθή) : Η συγκεκριμένη τεχνολογία, λειτουργεί ανεξάρτητα και δε σχετίζεται καθόλου με τη γενιά, ή την ισχύ τής CPU; Με άλλα λόγια, αν έχεις ένα σχετικά παρωχημένο επεξεργαστή, ο οποίος για την ολοκλήρωση μιας συγκεκριμένης διεργασίας χρειάζεται π.χ. 30 λεπτά, τοποθετώντας μια κάρτα γραφικών με CUDA CORES, η «δουλειά» γίνεται ταχύτερα; Δεν είναι έτσι ακριβώς. Σίγουρα δεν εξαρτάτε τόσο πολύ από την CPU αλλά εξαρτάτε από το σύστημα σου. Δηλαδή μπορεί να εξαρτάτε από την ταχύτητα της μνήμης ram που έχει το σύστημα σου. Τα δεδομένα που θέλεις να επεξεργαστείς τα τοποθετείς πρώτα στην ram και μετά τα στέλνεις στην GPU. Υπάρχει και άλλη λειτουργία που κάνεις map την μνήμη στην μνήμη της κάρτα. Γενικότερα σίγουρα επιταχύνει κάποια πράγματα όπως π.χ. επεξεργασία μεγάλου πλήθους δεδομένων αλλά εξαρτάτε πάντα από την εφαρμογή και το πόσο είναι δυνατή η παραλληλία. Οι ίδιοι λένε ότι μπορεί να πετύχει κατά μέσο όρο 40% επιτάχυνση. @Waldo_Vrs Δεν είναι μόνο το video rendering απλά εκεί έχει βρει μεγάλη εφαρμογή λόγο του προϋπάρχοντος framework. Μην ξεχνάμε ότι είναι μία τεχνολογία που εμφανίστηκε το 2006.
ChRis6 Δημοσ. 22 Μαρτίου 2013 Δημοσ. 22 Μαρτίου 2013 Κυριως αυτό ( παραλληλια ).Αν δεν υπάρχει αρκετή παραλληλοποιηση , πολλές φορές δεν σε συμφέρει να τρέξεις το προγραμμα στη καρτα γραφικων.Η διαφορα της αρχιτεκτονικής των GPU ( Manycore) είναι διαφορετική απο των CPU ( multicore).Οι πυρήνες των GPU είναι μεν πιο πολλοί,αλλά είναι πιο απλοι...@WaldoΌχι μπορει να χρησιμοποιήσεις την GPU για οποιονδήποτε άλλο σκοπό.
Aristomaxos Δημοσ. 23 Μαρτίου 2013 Δημοσ. 23 Μαρτίου 2013 (επεξεργασμένο) Ότι είπαν τα παιδιά παραπάνω ισχύει. Να σου μεταφέρω λοιπόν τη δική μου εμπειρία μου σχετικά μ' ένα πρόβλημα CFD (computational fluid dynamics) που έχω λύσει και έχω εκτελέσει την επίλυσή του τόσο στη CPU μου (Core 2 Duo E8400 OC στα 3,55 GHz) όσο και σε μερικές GPU που έχω στη κατοχή μου, οι οποίες είναι η 8800 GTS (16 SMs * 8 cores = 128 cores), η GTX 470 (14 SMs * 32 cores = 448 cores) καθώς και η GTX 660 (5 SMXs * 192 cores = 960 cores). Τον αριθμό των cores τον αναφέρω ενδεικτικά καθώς δεν είναι το μόνο που επηρεάζει τη ταχύτητα εκτέλεσης. Στο πρόβλημα αυτό υπάρχει ένα πλέγμα από σημεία το οποίο σε κάθε βήμα ανανεώνεται. Οι συντεταγμένες κάθε σημείου του πλέγματος επηρεάζονται απ' την αλληλεπίδρασή του με όλα τα υπόλοιπα σημεία. Έτσι π.χ αν έχω για ένα βήμα εκτέλεσης 10.000 σημεία των οποίων πρέπει να υπολογίσω τις συντεταγμένες, θα υπολογιστούν 10.000 * 10.000 = 108 συνεισφορές της επίδρασης για κάθε σημείο του πλέγματος απ' όλα τα υπόλοιπα. Η 8800 GTS εκτελεί αυτό το πρόβλημα περίπου 45 φορές πιο γρήγορα για ένα πάρα πολύ πυκνό πλέγμα και περίπου 25 φορές για ένα αρκετά αραιό πλέγμα σε σχέση με τον κώδικα OpenMP που τρέχει και στους δύο πυρήνες της CPU μου. Άρα ως προς έναν επεξεργαστή της CPU το speedup είναι 50x - 90x. Μια μέρα έτρεξα το πρόγραμμα για ένα πάρα πολύ πυκνό πλέγμα. Οι δύο πυρήνες της CPU το εκτέλεσαν σε 20 ώρες, ενώ η 8800 GTS σε 30 λεπτά! Επισημαίνω ότι ο κώδικας για τη CPU δεν είναι optimized. Απλά έχω φτιάξει κώδικα που να δίνει αξιόπιστα αποτελέσματα. Με τον κώδικα στη GPU έχω ασχοληθεί περισσότερο και πιστεύω ότι είναι περισσότερο optimized. H GTX 470 δίνει speedup ως προς την 8800 2,6x και η 660 δίνει speedup ως προς τη 470 1,1x. Τονίζω ότι ο ίδιος και απαράλλαχτος κώδικας δίνει αυτά τ' αποτελέσματα για όλες τις GPU. Παρατηρούμε ακόμα ότι η 660 με διπλάσιους και βάλε πυρήνες σε σχέση με την gtx 470 η οποία έχει άλλη αρχιτεκτονική απ' αυτήν της 660, αντί να δίνει στην ιδανική περίπτωση speedup περίπου κοντά στο 2x, αυτό δε συμβαίνει (νομίζω βέβαια ότι αν τρέξει ο κώδικας σε μια gtx 680 με 8 SMXs * 192 cores = 1536 cores, η οποία έχει την ίδια αρχιτεκτονική Kepler με τη gtx 660 θα δω speedup σε σχέση με την 660 περίπου 8/5 = 1,6) . Δε παίζει λοιπόν ρόλο μόνο ο αριθμός των πυρήνων αλλά και η αρχιτεκτονική γενικότερα της GPU. Συμπερασματικά, αν ο βαθμός παραλληλίας του προβλήματός σου είναι υψηλός τότε θα δεις η ταχύτητα εκτέλεσης στη GPU να έχει μία έως και δύο τάξεις μεγέθους speedup ως προς τη CPU. Υ.Γ Για τους μυημένους. Θα δοκιμάσω την εντολή shuffle για την gtx 660 αλλά και την πρόσβαση στη shared memory, καθώς η αρχιτεκτονική kepler έχει διπλάσιο bandwidth απ' ότι η Fermi. Ελπίζω να υπάρξει σημαντική διαφορά! Επεξ/σία 23 Μαρτίου 2013 από Aristomaxos
cyberrobot Δημοσ. 23 Μαρτίου 2013 Δημοσ. 23 Μαρτίου 2013 Πάντως από ότι έχω διαβάσει, λογικό είναι που η 660 δεν έχει και τόσο μεγάλη διαφορά από την 470. Όσο μεγαλύτερη η κάρτα γραφικών σαν μοντέλο τόσο καλύτερο bandwidth έχει (και αρχιτεκτονική θεωρώ) οπότε και τα δεδομένα σου έρχονται πιο γρήγορα. Όσο για την shared memory (pinned νομίζω την λέει, μπορεί να κάνω και λάθος) εκεί στοχεύω και εγώ για το project μου, είχα δει κάπου ότι υποστηρίζετε μόνο μέσω του Linux API εκτός αν πας στις μεγάλες quadro εκεί έρχεται και για windows. Το είχα ψιλό χαζέψει σε ένα παραδειγματάκι που είχα φτιάξει, απλά με είχε τρελάνει γιατί ο editor της nvidia το μάρκαρε σαν λάθος ενώ ο nvcc το πέρναγε κανονικά compile.... go figure!
ChRis6 Δημοσ. 23 Μαρτίου 2013 Δημοσ. 23 Μαρτίου 2013 @AristomaxosΓια να δεις το speedup πρέπει ο κώδικας στη CPU να είναι optimised και όχι απλά να "δουλεύει"Δοκίμασε να γράψεις καλύτερο κώδικα για CPU και πάρε πάλι μετρήσεις.Έτσι θα δεις το πραγματικό speedup σε σχέση με τις κάρτες σου
Aristomaxos Δημοσ. 23 Μαρτίου 2013 Δημοσ. 23 Μαρτίου 2013 Δεν έχει καμμία σχέση η shared memory που είναι on chip στη GPU με τη pinned memory (ή page-locked) η οποία όταν δεσμεύεται υπάρχει στη μνήμη RAM του ξενιστή (δηλ της CPU) ! To ίδιο global memory bandwidth περίπου έχει η GTX 470 (133,9 GB/s η Asus Reference) με την GTX 660 (144,2 GB/s η MSI OC που έχω). O kernel που καταναλώνει το περισσότερο χρόνο εκτέλεσης δεν είναι memory bound αλλά arithmetic bound, οπότε το memory throuput στη περίπτωση μου επηρεάζει λίγο. Αυτός ο kernel εκτελεί πολλές αριθμητικές πράξεις σε σχέση με τα δεδομένα που τραβάει απ' τη global memory. Για το shared memory throuput μίλησα στο προηγούμενο post που είναι για μεν την αρχιτεκτονική fermi 4 bytes ανά memory bank ανά clock cycle ανά SM, ενώ για την αρχιτεκτονική kepler είναι 8 bytes ανά memory bank ανά clock cycle ανά SMX. @ChRis6 Έχεις απόλυτο δίκιο ! Ανέφερα το speedup που προς το παρόν έχω, για να δώσω μια αίσθηση για τη διαφορά που μπορεί να υπάρχει μεταξύ της CPU και της GPU.
Ailuros Δημοσ. 23 Μαρτίου 2013 Δημοσ. 23 Μαρτίου 2013 Εύγε παίδες πάντα τέτοια. Aristomaxe, Θερμή παράκληση αν δεν σου κάνει κόπο: περισσότερους παράγραφους όταν γράφεις. Βοηθάει αφάνταστα τον άλλον να διαβάσει πολύ πιο άνετα ένα τόσο πυκνό κείμενο.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα