Intel Accelerate Your Code Semester Project at Parallel & Distributed systems Dimitrios S. Tsiktsiris University of Western Macedonia Department of Informatics & Telecommunications Engineering Kozani, Greece tsiktsiris@sch.gr Kimon P. Mantzaris University of Western Macedonia Department of Informatics & Telecommunications Engineering Kozani, Greece st0525@icte.uowm.gr I. ΕΙΑΓΩΓΗ θνπόο ηνπ θώδηθα είλαη λα βξίζθεη patterns δειαδή pixels κε ζπγθεθξηκέλε ζεηξά αλάκεζα ζε 2 ή θαη πεξηζζόηεξεο θσηνγξαθίεο. Θα κπνξνύζε λα ρξεζηκνπνηεζεί ώζηε λα αλαγλσξίδεη πξόζσπα, θηίξηα ή νηηδήπνηε άιιν αθόκα θαη ζε κεγάιεο αλάιπζεο θσηνγξαθίεο (όπσο πρ ελόο δνξπθόξνπ). ηελ εξγαζία απηή θαινύκαζηε λα παξαιιεινπνηήζνπκε ηνλ θώδηθα ρξεζηκνπνηώληαο ηηο ηερλνινγίεο OpenMP θαη OpenMPI. Οη κεηξήζεηο έγηλαλ ζε VM ηνπ GRNET ζε δηπύξηλν επεμεξγαζηή QEMU ρξνληζκέλν ζηα 2,1 GHz. Γηα ηελ εθηέιεζε ηνπ πξνγξάκκαηνο ρξεζηκνπνηήζακε ubuntu 12.04 θαη ηελ εληνιή time ώζηε λα κεηξήζνπκε ηνλ ρξόλν εθηέιεζεο. II. ΑΝΑΛΤΗ ΚΩΔΙΚΑ Ο πεγηαίνο θώδηθαο ηνπ πξνγξάκκαηνο απνηειείηαη απν ην θύξην αξρέην main.cpp ζην νπνίν γίλνληαη νη πεξηζζόηεξνη ππνινγηζκνί θαη ε ζύγθξηζε ησλ pixels θαη ην αξρείν BitmapImporter.cpp ην νπνίν είλαη ππεύζπλν γηα ηελ θόξησζε ησλ εηθόλσλ bitmap ζηε κλήκε ώζηε λα είλαη δπλαηή ε επεμεξγαζία ηνπο αξγόηεξα. Εκείο ζα αζρνιεζνύκε θπξίσο κε ην main.cpp θαη εηδηθόηεξα κε ην ζεκείν ηνπ θώδηθα πνπ μεθηλάεη ε ζύγθξηζε ησλ εηθόλσλ. Σν ζεκείν απηό βξίζθεηαη ζηελ ζεηξά 156 από ην master branch ηνπ project (ην branch πνπ πεξηέρεη ηνλ ζεηξηαθό θώδηθα). Απν εθεί μεθηλάεη κηα ζεηξά απν for loops νη νπνίεο θαηαλαιώλνπλ ηνλ κεγαιύηεξν ρξόλν θαηα ηελ εθηέιεζε ηνπ πξνγξάκκαηνο. Σν ζεκείν απηό ινηπνλ απνηειεί θξίζηκν ζεκείν (hotspot) θαη ζα επηθεληξσζνύκε εδώ γηα λα παξαιιεινπνηήζνπκε ηνλ θώδηθά καο. IV. ΠΑΡΑΛΛΗΛΟΠΟΙΗΗ ΜΕ OPENMPI Η παξαιιεινπνίεζε κε ην OpenMPI είλαη πην πνιύπινθε. Αξρηθά ζα πξέπεη λα δεκηνπξγήζνπκε κηα δνκή ζην MPI ε νπνία ζα πεξηέρεη: 1. Σν pattern id ηεο εηθόλαο ε νπνία βξέζεθε ζηελ θπξίσο εηθόλα. Είλαη ηα 3 πξώηα γξάκκαηα από ην όλνκα αξρείνπ ηεο εηθόλαο. 2. Σελ ζπληεηαγκέλε x ε νπνία είλαη ην πιάηνο ηνπ ζεκείνπ ζην νπνίν βξέζεθε pattern ζηελ θπξίσο εηθόλα. 3. Σελ ζπληεηαγκέλε y ε νπνία είλαη ην ύςνο ηνπ ζεκείνπ ζην νπνίν βξέζεθε pattern ζηελ θπξίσο εηθόλα. Όιεο νη κεηαβιεηέο ηεο δνκήο καο είλαη ηύπνπ INT (αθέξαηνο). Έηζη ινηπόλ δεκηνπξγήζακε ηνλ ηύπν κεηαβιεηήο θαη ηνλ θάλακε θαηαρώξεζε ζην MPI (branch openmpi, αξρείν main.cpp, ζεηξά 148). Απηό ην θάλακε γηαηί αξγόηεξα ζα πξέπεη λα ζηέιλνπκε ηελ δνκή κεηαμύ ησλ ranks κε ηηο εληνιέο MPI_Send & MPI_Recv. ηε ζπλέρεηα ηξνπνπνηήζακε έηζη ηα for loops ώζηε αλάινγα κε ηελ πνζόηεηα ησλ ranks γηλεηαη έλαο θαηαθεξκαηηζκόο ηεο εηθόλαο ζε κηθξόηεξα θνκκάηηα ζηα νπνία εηδηθεύεηαη ην θάζε rank. Γηα παξάδεηγκα κηα θσηνγξαθία κε αλάιπζε 10.000x10.000 κε 4 ranks ηόηε ην 1 ν ζα ειέγμεη ηα pixels πνπ αληηζηνηρνύλ ζηελ πεξηνρή [0-2.500]x10.000, ην 2 ν ζα ειέγμεη ηα pixels πνπ αληηζηνηρνύλ ζηελ πεξηνρή [2.500-5.000] x10.000 θ.η.ι. III. ΠΑΡΑΛΛΗΛΟΠΟΙΗΗ ΜΕ OPENMP Η παξαιιεινπνίεζε κε OpenMP έγηλε ζην branch openmp, παξαιιεινπνηώληαο ην δεύηεξν for loop. Η παξαιιεινπνίεζε έγηλε κε ηελ εληνιή #pragma omp parallel for ρσξίο λα ρξεηάδνληαη private ε shared κεηαβιεηέο θαη καο νδεγεί ζε κηα κείσζε ~34 δεπηεξνιέπησλ, δειαδή έρνπκε 36% speedup ζηνλ ρξόλν εθηέιεζεο. Σα απνηειέζκαηα από ηελ εθηέιεζε είλαη ίδηα κε ηα απνηειέζκαηα ηνπ ζεηξηαθνύ θώδηθα.
Γηα παξάδεηγκα ζηελ παξαπάλσ εηθόλα αλ ππνζέζνπκε όηη ηξέρνπκε ην πξόγξακκα κε 3 ranks ηόηε: To rank 1 ζα ειέγμεη ηα pixels πνπ αληηζηνηρνύλ ζηελ πξάζηλε πεξηνρή Σν rank 2 ζα ειέγμεη ηα pixels πνπ αληηζηνηρνύλ ζηελ γαιάδηα Σν rank 3 ζα ειέμεη ηα pixels πνπ αληηζηνηρνύλ ζηελ θόθθηλε πεξηνρή Εαλ βξεζεί απνηέιεζκα (δειαδή έρνπκε match) ηόηε ην θάζε rank ζηέιλεη ηα δεδνκέλα πνπ βξήθε ζην master rank ην νπνίν θαη ηα εθηππώλεη (branch openmpi, αξρείν main.cpp, ζεηξά 202). Σν πξόβιεκα εδώ είλαη όηη ηα απνηειέζκαηα δελ εκθαλίδνληαη ζε αιθαβεηηθή ζεηξά (δειαδή δελ γίλνληαη sort απν ην κεγαιύηεξν ζην κηθξόηεξν) όπσο γίλεηαη ζην ζεηξηαθό θαη ζην openmp δηόηη πιένλ δελ βξίζθνληαη ζε δπλακηθή ιίζηα. Παξ όια απηά ηα απνηειέζκαηα επαιεζεύνπλ όηη ε παξαιιεινπνίεζε έγηλε ζσζηά θαη πιένλ έρνπκε έλα speedup 73% πνπ ηζνδπλακεί κε κηα κείσζε 92 δεπηεξνιέπησλ ζηνλ ρξόλν εθηέιεζεο. V. COMPILE & ΕΚΣΕΛΕΗ Γηα λα θάλνπκε compile ρξεζηκνπνηνύκε ηελ εληνιή make all. Γηα λα γίλεη εθηέιεζε ηνπ πξνγξάκκαηνο κπαίλνπκε ζην θάθειν test_case_1 νπνπ βξίζθνληαη νη εηθόλεο, θαη ηξέρνπκε ην πξόγξακκα κε πξώηε παξάκεηξν ην scale ησλ εηθόλσλ, δεύηεξε ηα threads πνπ ζα ρξεζηκνπνηήζνπκε, ηξίηε παξάκεηξν ην όλνκα αξρείνπ ηεο θύξηαο εηθόλαο, ηέηαξηε ην όλνκα αξρείνπ ηεο πξώηεο εηθόλαο κε ην pattern θ.η.ι. Ελδεηθηηθή εληνιή γηα εθηέιεζε ππάξρεη θαη ζην αξρείν program_call_example. VI. ΕΠΙΛΟΓΟ Γηα ηελ αλάπηπμε ηνπ θώδηθα ρξεζηκνπνηήζακε ην ζύζηεκα εθδόζεσλ ινγηζκηθνύ GIT θαη ην www.github.com Σν repository κε ηνλ θώδηθα βξίζθεηαη ζηελ δηεύζπλζε https://github.com/tsiktsiris/ayc_final/ Δελ ρξεζηκνπνηήζακε θακία βνήζεηα παξα κόλν θαπνηεο πιεξνθνξίεο απν ηελ επίζεκε ηζηνζειίδα ηνπ OpenMPI www.open-mpi.org
Screenshots εηξηαθόο ρξόλνο εθηέιεζεο θαη απνηειέζκαηα
Υξόλνο εθηέιεζεο ηνπ παξαιιεινπνηεκέλνπ ζε OpenMP πξνγξάκκαηνο θαη απνηειέζκαηα
Δευτερόλεπτα Υξόλνο εθηέιεζεο ηνπ παξαιιεινπνηεκέλνπ ζε OpenMPΙ πξνγξάκκαηνο θαη απνηειέζκαηα 150 time (s) 100 50 0 Σεριακό OpenMP OpenMPI time (s) 126 92 34