Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

το να πάω στην σχολή για άλλο λόγο εκτώς του να παραλάβω το πτυχίο το αποκλείουμε :P απο εκει και πέρα δεν είναι κάτι να πάρω μια κάρτα των 30 ευρώ για να "παίξω"...

 

αυτό που λές για CPU και GPU, έχω την εντύπωση οτι στο παραδειγματάκι που ετρεξα παραπάνω εχει πλεονέκτημα η CPU γιαυτό και τρέχει πιο γρήγορα. (αν και τα νούμερα αλλάζουν κάθε φορά που το τρέχω απο 8-20ms) ... η μέθοδος getMaxFlopsDevice() πάντως  επιστρέφει την CPU σαν πιο γρήγορη...

Δημοσ.

Το κυριότερο που πρέπει να προσέξεις είναι η λύση να είναι 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 :P

edit:
Δεν είναι παράξενο που η CPU είναι πιο γρήγορη από τη GPU στη μέτρηση που δίνεις στο spoiler.Κάτι τέτοιο μπορεί να συμβεί.

Επίσης νομίζω οτι σε java είναι λίγο δύσκολο να κάνεις κάτι,εκτός κι αν έχω μείνει πίσω.Οι kernels σε openCL δίνονται σε C και στην cuda  σε C/C++(φυσικά χωρίς τα καλούδια της std)

Δημοσ.

και στο παράδειγμα που εκανα ο kernel σε C είναι.. απλά μέσω του Jocl σου δίνει την δυνατότητα να δώσεις ορίσματα στον kernel και να επιστρέψεις στην Java τα δεδομένα της παράλληλης επεξεργασίας ωστε να τα κάνεις ότι θέλεις μετά... :)

Δημοσ.

και στο παράδειγμα που εκανα ο kernel σε C είναι.. απλά μέσω του Jocl σου δίνει την δυνατότητα να δώσεις ορίσματα στον kernel και να επιστρέψεις στην Java τα δεδομένα της παράλληλης επεξεργασίας ωστε να τα κάνεις ότι θέλεις μετά... :)

Ε εντάξει.Και σε άλλες γλώσσες κάνεις τέτοια πράγματα

 

Δημοσ.

Οι kernels της OpenCL δεν γράφονται σε C αλλά σε μια γλώσσα που (επίτηδες) μοιάζει πολύ με την C. Από εκεί και πέρα, το να τους περάσεις στην κάρτα γραφικών όπου και τρέχουν, μπορεί να γίνει από πολλές γλώσσες, π.χ. C/C++ ή Java.

Δημοσ.

Θα σου πρότεινα να δώσεις λίγη βάση στην επιλογή GPU. Πρέπει να ξέρεις τί μικρο-αρχιτεκτονική κουβαλάει. Ο τρόπος προγραμματισμού αλλάζει από αρχιτεκτονική σε αρχιτεκτoνική, όπως επίσης αλλάζουν και κάποιες εντολές, είτε ως προς την "passive" λειτουργικότητα είτε στην ύπαρξή τους.

 

Για παράδειγμα η κλήση ενός kernel πριν τις Fermi ήταν blocking. Τώρα δεν είναι. Πριν τη Fermi δεν υπήρχε cache. Στις καινουργιες μικρο-αρχιτεκτνικές δε θα υποστηρίζεται constant memory.

 

Έτσι καταλαβαίνεις πως ότι γράψεις σε κάποια παλιά μικρο-αρχιτεκτονική δε θα είναι forward compatible με τις επόμενες κατά πάσα πιθανότητα. Αυτό εξαρτάται από την έκδοση της ενδιάμεσης αναπαράστασης που χρησιμοποιεί η nvidia, την PTX.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...