Luciddream Δημοσ. 5 Ιουνίου 2014 Μέλος Δημοσ. 5 Ιουνίου 2014 το να πάω στην σχολή για άλλο λόγο εκτώς του να παραλάβω το πτυχίο το αποκλείουμε απο εκει και πέρα δεν είναι κάτι να πάρω μια κάρτα των 30 ευρώ για να "παίξω"... αυτό που λές για CPU και GPU, έχω την εντύπωση οτι στο παραδειγματάκι που ετρεξα παραπάνω εχει πλεονέκτημα η CPU γιαυτό και τρέχει πιο γρήγορα. (αν και τα νούμερα αλλάζουν κάθε φορά που το τρέχω απο 8-20ms) ... η μέθοδος getMaxFlopsDevice() πάντως επιστρέφει την CPU σαν πιο γρήγορη...
ChRis6 Δημοσ. 5 Ιουνίου 2014 Δημοσ. 5 Ιουνίου 2014 Το κυριότερο που πρέπει να προσέξεις είναι η λύση να είναι data parallel για να ταιριάζει στο hardware μιας GPU.Αν δεν είναι,τότε πρέπει να κάνεις 'χακιες' για να κερδίσεις σε χρόνο.Μπορεί μια GPU να έχει 60K+ registers και να μπορείς να τρέχεις μερικά εκατομμύρια threads,αλλά αν το κάθε νήμα κανει οτι του έρθει,τότε μειώνεται σημαντικά το throughput.Π.χΕγώ τώρα στην πτυχιακή μου κάνω για ray tracing.Μπορεί ο υπολογισμός να είναι embarrassingly parallel,αλλά δεν ταιριάζει στο hardware της GPU.Πρέπει να αλλάξω τον κλασσικό τρόπο φωτισμού,αντανάκλασης κτλ ώστε να μην υπάρχει divergence,memory bank collisions και πολλά άλλα που δεν τα βλέπουμε στον 'παλιο´ τρόπο υπολογισμού σε εναν επεξεργαστή.Και όλα αυτά γιατί το hardware της GPU έχει σχεδιαστεί για rasterization.Αν θες απλά να ζωγραφίσεις ενα simulation(π.χ με bullet physics) και όχι να κάνεις υπολογισμούς σε κάρτα γραφικών,τότε οποιαδήποτε GPU σήμερα σου κάνει.Οι shaders πάλι θα σου είναι σχεδόν άχρηστοι αν το πρόβλημα σου δεν ταιριάζει στο pipeline του rasterazation(π.χ openGL ή DX).Θα πρέπει να "μεταμφιέσεις" το πρόβλημα σε rendering γραφικών για να πάρεις κάποιο αποτέλεσμα.Γιατί λοιπόν να μπεις σε τέτοια διαδικασία αντί να γράψεις κατευθείαν kernel για GPU ;OpenCL FTW edit:Δεν είναι παράξενο που η CPU είναι πιο γρήγορη από τη GPU στη μέτρηση που δίνεις στο spoiler.Κάτι τέτοιο μπορεί να συμβεί.Επίσης νομίζω οτι σε java είναι λίγο δύσκολο να κάνεις κάτι,εκτός κι αν έχω μείνει πίσω.Οι kernels σε openCL δίνονται σε C και στην cuda σε C/C++(φυσικά χωρίς τα καλούδια της std)
Luciddream Δημοσ. 5 Ιουνίου 2014 Μέλος Δημοσ. 5 Ιουνίου 2014 και στο παράδειγμα που εκανα ο kernel σε C είναι.. απλά μέσω του Jocl σου δίνει την δυνατότητα να δώσεις ορίσματα στον kernel και να επιστρέψεις στην Java τα δεδομένα της παράλληλης επεξεργασίας ωστε να τα κάνεις ότι θέλεις μετά...
ChRis6 Δημοσ. 5 Ιουνίου 2014 Δημοσ. 5 Ιουνίου 2014 και στο παράδειγμα που εκανα ο kernel σε C είναι.. απλά μέσω του Jocl σου δίνει την δυνατότητα να δώσεις ορίσματα στον kernel και να επιστρέψεις στην Java τα δεδομένα της παράλληλης επεξεργασίας ωστε να τα κάνεις ότι θέλεις μετά... Ε εντάξει.Και σε άλλες γλώσσες κάνεις τέτοια πράγματα
nplatis Δημοσ. 5 Ιουνίου 2014 Δημοσ. 5 Ιουνίου 2014 Οι kernels της OpenCL δεν γράφονται σε C αλλά σε μια γλώσσα που (επίτηδες) μοιάζει πολύ με την C. Από εκεί και πέρα, το να τους περάσεις στην κάρτα γραφικών όπου και τρέχουν, μπορεί να γίνει από πολλές γλώσσες, π.χ. C/C++ ή Java.
gon1332 Δημοσ. 6 Ιουνίου 2014 Δημοσ. 6 Ιουνίου 2014 Θα σου πρότεινα να δώσεις λίγη βάση στην επιλογή GPU. Πρέπει να ξέρεις τί μικρο-αρχιτεκτονική κουβαλάει. Ο τρόπος προγραμματισμού αλλάζει από αρχιτεκτονική σε αρχιτεκτoνική, όπως επίσης αλλάζουν και κάποιες εντολές, είτε ως προς την "passive" λειτουργικότητα είτε στην ύπαρξή τους. Για παράδειγμα η κλήση ενός kernel πριν τις Fermi ήταν blocking. Τώρα δεν είναι. Πριν τη Fermi δεν υπήρχε cache. Στις καινουργιες μικρο-αρχιτεκτνικές δε θα υποστηρίζεται constant memory. Έτσι καταλαβαίνεις πως ότι γράψεις σε κάποια παλιά μικρο-αρχιτεκτονική δε θα είναι forward compatible με τις επόμενες κατά πάσα πιθανότητα. Αυτό εξαρτάται από την έκδοση της ενδιάμεσης αναπαράστασης που χρησιμοποιεί η nvidia, την PTX.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα