Evgenios1 Δημοσ. 20 Μαΐου 2010 Δημοσ. 20 Μαΐου 2010 Τα λογια ειναι περιττα. Μια εικωνα 1kib λεξεις. Εκμεταλλευση στο full. testing >using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace parall { class Program { static void Main(string[] args) { const uint size = 0x004ffffff; Random r = new Random(); int[] arr = new int[size]; for (int i = 0; i < size; i++) { arr[i] = r.Next(); } parall_ordering(arr); def_ordering(arr); Console.Read(); } static void def_ordering(int[] arr) { var start = DateTime.Now; for (int i = 0; i < 100; i++) { if (i % 2 == 0) arr.Min(); else arr.Max(); } Console.WriteLine("defualt:{0}sec",(DateTime.Now-start).TotalSeconds); } static void parall_ordering(int[] arr) { var pq = arr.AsParallel(); var start = DateTime.Now; for (int i = 0; i < 100; i++) { if (i % 2 == 0) pq.Min(); else pq.Max(); } Console.WriteLine("end: {0}sec", (DateTime.Now - start).TotalSeconds); } } }
karabouzouk... Δημοσ. 21 Μαΐου 2010 Δημοσ. 21 Μαΐου 2010 Μπορείς να εξηγήσεις λίγο τι ακριβώς κάνεις με αυτό το πρόγραμμα και σε τι χρησιμεύει..?
ippo00 Δημοσ. 21 Μαΐου 2010 Δημοσ. 21 Μαΐου 2010 Πρώτα απ' όλα δεν μπορείς να βγάλεις έτσι συμπεράσματα. Δεν κάνεις κάν σύγκριση με το 3.5, Ούτε ανταποκρίνεται σε ένα real life πρόγραμμα, δηλαδή που ξέρεις ότι όλο αυτό δεν είναι overhead; Γιατί να μην κάνουμε και ένα hello world crash test; Επίσης 1kib λέξεις είναι λιγότερες από 1000 λέξεις edit: Δεν θέλω να σου την πω κτλπ αλλά ξέρω γω, άν μια χελώνα τρέχει σε έναν αγώνα μόνο του και κερδίσει δεν παει γρήγορα απλά είδες ότι χρησιμοποιεί και τα τέσσερα πόδια
V.I.Smirnov Δημοσ. 21 Μαΐου 2010 Δημοσ. 21 Μαΐου 2010 άν μια χελώνα τρέχει σε έναν αγώνα μόνο του και κερδίσει δεν παει γρήγορα απλά είδες ότι χρησιμοποιεί και τα τέσσερα πόδια Συμφωνώ απόλυτα. Πού το είδες ότι είναι 100% ; Για 4 πυρήνες, 100% θα ήταν έκανε 4 φορές λιγότερο χρόνο. Εδώ είναι κάτι λιγότερο από το μισό. δηλ. η μισή επεξεργαστική ισχύς δεν είναι εκμεταλεύσιμη.
Evgenios1 Δημοσ. 22 Μαΐου 2010 Μέλος Δημοσ. 22 Μαΐου 2010 Συμφωνώ απόλυτα. Πού το είδες ότι είναι 100% ; Για 4 πυρήνες, 100% θα ήταν έκανε 4 φορές λιγότερο χρόνο. Εδώ είναι κάτι λιγότερο από το μισό. δηλ. η μισή επεξεργαστική ισχύς δεν είναι εκμεταλεύσιμη. Σε 4 πυρηνες δεν ξερω τι θα γινοταν. Εχω 3, και το προγραμμα ειναι αρκετα πρωχειρο, αλλα και παλι φαινεται οτι ο χρονος ειναι 1/3 (εστω κοντα στο 1/3) Πρώτα απ' όλα δεν μπορείς να βγάλεις έτσι συμπεράσματα. Δεν κάνεις κάν σύγκριση με το 3.5, Ούτε ανταποκρίνεται σε ένα real life πρόγραμμα, δηλαδή που ξέρεις ότι όλο αυτό δεν είναι overhead; Γιατί να μην κάνουμε και ένα hello world crash test; Επίσης 1kib λέξεις είναι λιγότερες από 1000 λέξεις edit: Δεν θέλω να σου την πω κτλπ αλλά ξέρω γω, άν μια χελώνα τρέχει σε έναν αγώνα μόνο του και κερδίσει δεν παει γρήγορα απλά είδες ότι χρησιμοποιεί και τα τέσσερα πόδια Μιλαω για νεες τεχνολογιες που εχει το dotnet. Γενικοτερα για PLINQ. Δεν ξερω που θες να το πας...(μαλλον flame...)
V.I.Smirnov Δημοσ. 22 Μαΐου 2010 Δημοσ. 22 Μαΐου 2010 Σε 4 πυρηνες δεν ξερω τι θα γινοταν. Εχω 3, και το προγραμμα ειναι αρκετα πρωχειρο, αλλα και παλι φαινεται οτι ο χρονος ειναι 1/3 (εστω κοντα στο 1/3) Δεν είναι αυτός σωστός τρόπος για κάνεις μέτρηση, δεν λέει απολύτως τίποτε. Να σε αδρές γραμμές μια ιδέα. Πρέπει να δεις πώς μεταβάλλεται ο χρόνος εκτέλεσης με το μέγεθος του προβλήματος δηλ. να κάνεις το διάγραμμα (memory footprint) <--> (χρόνος). Γράψε ένα πρόγραμμα που κάνει κάτι σε κάποιον πίνακα και βάλε το να τρέξει για μέγεθος πίνακα με διαστάσεις που αυξάνονται σταδιακά ώστε η απαιτούμενη μνήμη να είναι από μια πολύ μικρή τιμή μέχρι να καταληφθεί σχεδόν ολόκληρη. Μέτρα πόσο χρόνο κάνει. Αυτό πρέπει να το εξετάσεις σε συνάρτηση με το πλήθος των επεξεργαστών που χρησιμοποιούνται. Οπότε το τρέχεις για 2, 3, 4 νήματα. Τρέξτο άλλη μια φορά με την παραλληλία ενεργοποιημένη αλλά με 1 νήμα (δηλ. έναν επεξεργαστή) ώστε να μετρηθεί το overhead της παραλληλίας. Τα αποτελέσματα θα σου δώσουν μια εικόνα της κλιμακωσιμότητας (για το συγκεκριμένο πρόγραμμα, διότι συνήθως το στυλ γραφής επηρεάζει το αποτέλεσμα σε αρχιτεκτονικές διαμοιραζόμενης μνήμης). Το ιδανικό είναι να διατηρείται η γραμμικότητα. Με 3 πυρήνες δεν φαίνονται πολλά, οι διαφορές γίνονται εμφανείς από 6 και πάνω. Τα αποτελέσματα μάλλον θα είναι απογοητευτικά, ειδικά όσο το πλήθος των πυρήνων (άρα και των νημάτων) αυξάνεται. Το θέμα είναι πόσο. Kαι κάτι άλλο. Κάνει vectorizing το VS2010 ? Κάνει αυτόματη παραλληλία ? Πχ. ο compiler της intel για C++ και fortran κάνει αλλάζοντας μόνον ένα flag. Πράγμα που σημαίνει ότι ο αρχάριος χρήστης μπορεί να πετύχει παρόμοια επίδοση με την παραπάνω (εξαρτάται από το πρόγραμμα) χωρίς ούτε μια γραμμή κώδικα ! Η C# δεν υποστηρίζει (απ' όσο ξέρω τουλάχιστον) το openMP που είναι το στάνταρ και η MS κάνει διάφορες "ιδιοκατασκευές" για να καλύψει το κενό. Πχ. η intel έχει την βιβλιοθήκη ΜΚL βελτιστοποιημένη για αριθμητικές πράξεις και την TBB για γενική χρήση καθώς και διάφορα εργαλεία όπως το thread checker εδώ και χρόνια αλλά αυτά δεν λειτουργούν με την C#. Γενικά, εντάξει, είναι καλή η προσπάθεια της MS και όποιος δουλεύει σε C# θα την εκτιμήσει. Αλλά για τις C/C++/fortran που χρησιμοποιούνται σε σοβαρή δουλειά υπάρχουν δοκιμασμένα εργαλεία εδώ και αρκετό καιρό.
jstark Δημοσ. 22 Μαΐου 2010 Δημοσ. 22 Μαΐου 2010 Ρε παιδιά, μην το κάνουμε flame το πράγμα, ο άνθρωπος έκανε ενα απλο προγραμματάκι για να δείξει πως υπάρχει μια υποστηριξη για παραλληλισμό σε .ΝΕΤ 4.0. Απο αυτά που έδειξε, πέτυχε να μειώσει το χρόνο του προγράμματος (ότι και να ήταν αυτό) σχεδόν στο 1/3. Αυτό ήθελε να δείξει το παιδί. Όλοι από κάπου δεν ξεκινάνε; Δεν έκανε κάτι κακό. Για όσους ενδιαφέρονται, οι αντίστοιχες "τεχνολογίες" της Apple και Intel είναι οι Grand Central Dispatch Thread Building Blocks Καί οι τρεις τεχνολογίες (μαζί με αυτή της M$) βασίζονται στο Thread Pool Pattern. Όσοι ενδιαφέρονται για native multi-core programming με Μ$-based τεχνολογια, ας δουν εδω: http://msdn.microsoft.com/en-us/library/dd504870(VS.100).aspx Πάντως θα είχε ενδιαφέρον να δουμε, πχ σε Windows, πως κάνει scale το κάθε tool (M$, intel) σε ενα απλό πρόγραμμα, πχ, πολλαπλασιασμό πινάκων.
Christos75 Δημοσ. 24 Μαΐου 2010 Δημοσ. 24 Μαΐου 2010 Συμφωνώ και εγώ...προχθές μ'ενα φίλο μου μιλούσαμε ακριβώς γι'άυτό το θέμα και την εκμετάλλευση των περισσότερων των δύο πυρήνων και η κουβέντα μας είχε να κάνει με το parallel for !!!!
V.I.Smirnov Δημοσ. 24 Μαΐου 2010 Δημοσ. 24 Μαΐου 2010 Συμφωνώ και εγώ...προχθές μ'ενα φίλο μου μιλούσαμε ακριβώς γι'άυτό το θέμα και την εκμετάλλευση των περισσότερων των δύο πυρήνων και η κουβέντα μας είχε να κάνει με το parallel for !!!! Με τι συμφωνείς απ' όσα γράψαμε ; To parallel for είναι πολύ εύκολο να γίνει. Το θέμα είναι να ξέρουμε πόσο καλά κλιμακώνεται στις διάφορες πλατφόρμες. Ενδεικτικά είχα δοκιμάσει ένα benchmark (ιδιοκατασκευή) πριν καιρό στο openMP σύμφωνα με όσα γράφω παραπάνω στο μηχάνημα ενός φίλου που έχει 8 πυρήνες (2 4πύρηνους Xeon). Ο κόρος εμαφανιζόταν με 10-12 νήματα και η κλιμακωσιμότητα χωρίς ειδική μέριμνα ήταν περίπου 50-60 %. Απογοήτευση δηλαδή. Δεν πιστεύω ότι και οι προσθήκες της MS θα τα καταφέρνουν καλύτερα εφόσον στηρίζονται στις ίδιες αρχές (συστήματα διαμοιραζόμενης μνήμης με threading pool κλπ). Τα πράγματα ήταν καλύτερα με 4 ή 2 νήματα.
Evgenios1 Δημοσ. 26 Μαΐου 2010 Μέλος Δημοσ. 26 Μαΐου 2010 Δεν μιλαμε για μια parallel for αλλα για parallel linq. Υγ: 2x xeon quad core. ειχα και εγω απο αυτα για να παιζω τα 1080p μου.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.