Next                Up                Back                Contents

Επόμενο:2.2 Παράδειγμα : Παράλληλη Ταξινόμηση Πάνω:Κεφάλαιο 2ο: Παραλληλισμός Δεδομένων Πίσω:Κεφάλαιο 2ο: Παραλληλισμός Δεδομένων


 

2.1 Εντολή FORALL

 

Η πιο σημαντική έννοια για τη δημιουργία παράλληλων προγραμμάτων είναι η διεργασία. Η υπολογιστική δραστηριότητα σε ένα παράλληλο υπολογιστή γεννιέται, όταν μια διεργασία ανατίθεται σε κάποιο επεξεργαστή. Ανεπίσημα, μπορούμε να θεωρήσουμε την διεργασία ως ένα τμήμα του κώδικα του προγράμματος, που ανατίθεται σε κάποιο επεξεργαστή προς εκτέλεση. Τα κοινά σειριακά προγράμματα μπορούν να θεωρηθούν σαν μια ειδική περίπτωση των παράλληλων, στα οποία υπάρχει μία μόνο διεργασία και ένας μόνο επεξεργαστής. Όταν ένα τέτοιο σειριακό πρόγραμμα ξεκινά να εκτελείται σε έναν υπολογιστή, ο επεξεργαστής εκτελεί το σώμα του κυρίως προγράμματος ξεκινώντας από την πρώτη εντολή. Για αυτό και το κυρίως πρόγραμμα μπορεί να θεωρηθεί ως τη διεργασία που εκτελείται από τον επεξεργαστή.

 

2.1.1 Δημιουργία Διεργασιών

 

Στα προγράμματα που είναι γραμμένα σε Multi-Pascal η εκτέλεση του προγράμματος όπως και στα σειριακά ξεκινά ακριβώς με τον ίδιο τρόπο: το κυρίως πρόγραμμα γίνεται η πρώτη διεργασία και ανατίθεται στον πρώτο επεξεργαστή προς εκτέλεση. Το κυρίως πρόγραμμα μπορεί να περιέχει οποιοδήποτε είδος εντολών που συναντάται στα σειριακά προγράμματα, όπως είναι οι αναθέσεις μεταβλητών, οι βρόχοι, οι συνθήκες και οι εντολές εισόδου-εξόδου (I/O). Ωστόσο, στη Multi-Pascal εμφανίζεται και ένα νέο είδος εντολών που δεν υπάρχει στα σειριακά προγράμματα: οι εντολές δημιουργίας διεργασιών. Υπάρχουν συγκεκριμένες εντολές στη Multi-Pascal, η εκτέλεση των οποίων προκαλεί την δημιουργία ολότελα νέων διεργασιών και την ανάθεση τους σε άλλους επεξεργαστές προς εκτέλεση. Με αυτόν τον τρόπο ξεκινά σε ένα πρόγραμμα η παράλληλη δραστηριότητα: μια ήδη υπάρχουσα διεργασία που εκτελείται σε ένα επεξεργαστή, εκτελεί μια εντολή δημιουργίας διεργασίας. Η νέα διεργασία που δημιουργείται καλείται διεργασία-παιδί ενώ ο δημιουργός ονομάζεται διεργασία-γονέας.

Η πιο ισχυρή μέθοδος για την δημιουργία παράλληλων διεργασιών στη Multi-Pascal είναι η εντολή FORALL, που είναι ένα παράλληλο είδος του βρόχου FOR όπου οι επαναλήψεις εκτελούνται παράλληλα και όχι σειριακά. Με τη χρήση της FORALL, μπορούμε να δημιουργήσουμε εκατοντάδες παράλληλων διεργασιών πετυχαίνοντας τρομερή επιτάχυνση στην εκτέλεση του προγράμματος. Η εντολή FORALL είναι ιδιαίτερα χρήσιμη όταν κάποιος έχει να αντιμετωπίσει μεγάλους πίνακες, γεγονός πολύ κοινό σε μια μεγάλη ποικιλία μεθόδων αριθμητικών υπολογισμών που χρησιμοποιούνται στις φυσικές επιστήμες. Για παράδειγμα, φανταστείτε το παρακάτω τμήμα ενός σειριακού προγράμματος που υπολογίζει την τετραγωνική ρίζα κάθε στοιχείου ενός πίνακα:

 

PROGRAM  Squareroot;
VAR	A :  ARRAY [1..100] OF REAL;
I :  INTEGER;
  BEGIN
  .....
  FOR	i := 1 TO 100 DO
	A[i] := SQRT( A[i] );
	.....
  END.

 

Το παραπάνω πρόγραμμα μπορεί να μετατραπεί από σειριακή σε παράλληλη μορφή, υπολογίζοντας την τετραγωνική ρίζα και των 100 στοιχείων του πίνακα με 100 παράλληλες διεργασίες:

 

PROGRAM ParallelSquareroot;
VAR	A :  ARRAY [1..100] OF REAL;
	I :  INTEGER;
  BEGIN
  .....
  FORALL i := 1 TO 100 DO
	A[i] := SQRT( A[i] );
  .....
  END.

Η εντολή FORALL δημιουργεί 100 αντίγραφα της εντολής ανάθεσης που περιέχεται μέσα στην FORALL και μετά τα κάνει ξεχωριστές παράλληλες διεργασίες που η κάθε μία έχει μια μοναδική τιμή του δείκτη i. Οι 100 αυτές διεργασίες μπορούν να εκτελεστούν παράλληλα σε διαφορετικούς επεξεργαστές. Αυτό παρουσιάζεται στο σχέδιο 2.1. Το κυρίως πρόγραμμα που εκτελείται στον Νο 0 επεξεργαστή είναι η διεργασία-γονέας, που δημιουργεί 100 διεργασίες-παιδιά για τους 100 επεξεργαστές του συστήματος διαμοιραζόμενης μνήμης. Ο πίνακας Α είναι αποθηκευμένος στη διαμοιραζόμενη μνήμη και έτσι είναι εύκολα προσβάσιμος από τους επεξεργαστές. Οι επεξεργαστές λειτουργούν παράλληλα, με τον καθένα να δουλεύει με ένα διαφορετικό στοιχείοτου πίνακα.

Είναι χρήσιμο να εξετασθεί λεπτομερειακά ο ρόλος του δείκτη i . Στην περίπτωση του σειριακού βρόχου FOR, ο δείκτης i του πίνακα Α είναι μια απλή ακέραια μεταβλητή που παίρνει την τιμή 1 στην πρώτη επαναληπτική διαδικασία, μετά την τιμή 2 στην δεύτερη επανάληψη και ούτω καθεξής. Καθώς η κάθε επανάληψη του βρόχου ξεκινά, ο δείκτης i του πίνακα Α αυτόματα αυξάνεται και η νέα τιμή μπορεί να χρησιμοποιηθεί μέσα στο βρόχο. Αυτή είναι η τυπική συμπεριφορά των βρόχων στην Pascal.

 

imageForall

ΣΧHMA 2.1 Δημιουργία Διεργασιών με την Εντολή FORALL

 

Στην περίπτωση της εντολής FORALL, ο δείκτης i δηλώνεται με τον ίδιο τρόπο στην αρχή του προγράμματος όπως μια ακέραια μεταβλητή. Επομένως, η μεταβλητή i είναι μια απλή μεταβλητή της διαμοιραζόμενης μνήμης. Όμως, εάν οι επαναλήψεις του βρόχου εκτελούνται παράλληλα, τότε μια απλή μεταβλητή πίνακα i δεν είναι επαρκής-όλες οι τιμές του i από το 1 έως το 100 πρέπει να είναι ταυτόχρονα διαθέσιμες. Στην εφαρμογή της Multi-Pascal αυτή η αναγκαιότητα ικανοποιείται αυτόματα εξασφαλίζοντας ότι ο κάθε επεξεργαστής έχει ένα δικό του τοπικό αντίγραφο του δείκτη i. Αυτό σημαίνει ότι ο επεξεργαστή 1 έχει ένα δείκτη i με τιμή 1, ο επεξεργαστής 2 έχει ένα δείκτη i με τιμή 2 , και ούτω καθεξής.

Στο παραπάνω παράλληλο πρόγραμμα Square Root, η εντολή FORALL πραγματικά δημιουργεί 100 διεργασίες παιδιά. Ο κώδικας του προγράμματος για κάθε διεργασία είναι ο ίδιος, ένα απλό αντίγραφο του σώματος της FORALL:

 

A[i] := SQRT( A[i] );

Όμως σε κάθε διεργασία παιδί δίνεται αυτόματα το δικό της τοπικό αντίγραφο του δείκτη i, το οποίο και αρχικοποιείται με την κατάλληλη τιμή. Έτσι, αν και ο κάθε επεξεργαστής εκτελεί τον ίδιο κώδικα με τους υπόλοιπους, το αποτέλεσμα μπορεί να είναι διαφορετικό εξαιτίας των διαφορετικών τιμών του τοπικού δείκτη i.

 

2.1.2 Μέγεθος Διεργασίας

 

 

Ένα σημαντικό θέμα που εμφανίζεται μέσα στα πλαίσια αυτού του παραδείγματος είναι η διάρκεια ή ο χρόνος εκτέλεσης κάθε διεργασίας, που μερικές φορές ονομάζεται μέγεθος (Granularity) της διεργασίας. Σε οποιοδήποτε υπολογιστικό σύστημα, υπάρχει μια γενική καθυστέρηση που σχετίζεται με την δημιουργία παράλληλης διεργασίας και την αποστολή της σε συγκεκριμένο επεξεργαστή όπου και θα εκτελεστεί. Προκειμένου να δικαιολογηθεί αυτή η καθυστέρηση, το μέγεθος της διεργασίας πρέπει να είναι μεγαλύτερο από την καθυστέρηση δημιουργίας της διεργασίας. Στο παραπάνω παράδειγμα του Parallel Square Root, η εντολή FORALL εφαρμόζεται εσωτερικά αυξάνοντας τον δείκτη i από 1 σε 100 και δημιουργώντας μια διεργασία για κάθε τιμή του πίνακα.

Για να δημιουργηθεί μια διεργασία, απαιτείται κάποια υπολογιστική δραστηριότητα και επομένως καταναλώνεται και κάποιος υπολογιστικός χρόνος. Η δημιουργία μιας καινούργιας διεργασίας συχνά περιλαμβάνει και την προσθήκη καινούργιων εγγραφών σε πίνακες του λειτουργικού συστήματος, πιθανά αλλάζοντας μερικούς δείκτες και άλλα παρόμοια. Τυπικά η διαδικασία δημιουργίας της διεργασίας μπορεί να απαιτεί την εκτέλεση 30 έως 40 εντολών σε επίπεδο μηχανής ή ακόμα και περισσότερες σε ορισμένα συστήματα υπολογιστών. Όταν η εντολή FORALL στο παραπάνω Parallel Square Root πρόγραμμα εκτελείται στον Επεξεργαστή 0, η παρακάτω υπολογιστική δραστηριότητα θα συμβεί στον Επεξεργαστή 0:

 

Δημιούργησε τη διεργασία-παιδί και δώσ’ την στον Επεξεργαστή 1;

Δημιούργησε τη διεργασία-παιδί και δώσ’ την στον Επεξεργαστή 2;

Δημιούργησε τη διεργασία-παιδί και δώσ’ την στον Επεξεργαστή 3;

.

.

.

Δημιούργησε τη διεργασία-παιδί και δώσ’ την στον Επεξεργαστή 1;

 

Αν ο χρόνος δημιουργίας της διεργασίας διαρκεί 10 μονάδες χρόνου σε αυτό το σύστημα, τότε η εντολή FORALL απαιτεί 100*10=1000 μονάδες χρόνου στον επεξεργαστή 0 για δημιουργήσει όλες τις διεργασίες. Υποθέστε ότι η εντολή ανάθεσης που μορφοποιεί το σώμα εντολών της διεργασίας παιδιού απαιτεί 10 μονάδες χρόνου για να εκτελεστεί. Από τη στιγμή που όλες αυτές οι διεργασίες - παιδιά εκτελούνται παράλληλα σε διαφορετικούς φυσικούς επεξεργαστές απαιτούν μόνο 10 επιπρόσθετες μονάδες του συνολικού χρόνου. Όμως, ο συνολικός χρόνος που περνάει έως ότου να ενεργοποιηθεί η εντολή FORALL είναι πραγματικά 1010. Η διεργασία γονέας που εκτελείται στον Επεξεργαστή 0 πρέπει να τρέχει για 1000 μονάδες χρόνου προκειμένου να δημιουργηθούν όλες οι διεργασίες- παιδιά, και μετά όλες αυτές οι διεργασίες παιδιά τρέχουν παράλληλα μόνο μέσα σε 10 μονάδες χρόνου. Έτσι, ο συνολικός χρόνος για να εκτελεστεί η εντολή FORALL είναι 1010.

Τώρα υποθέστε ότι ο βρόχος FORALL αντικαθίστανται με ένα απλό σειριακό βρόχο FOR. Εφόσον αυτός είναι σειριακός, όλος ο βρόχος θα εκτελείται απλά στον Επεξεργαστή 0. Από την στιγμή που το σώμα του βρόχου απαιτεί μόνο 10 μονάδες χρόνου, ολόκληρος ο βρόχος FOR θα απαιτεί 100*10=1000 μονάδες χρόνου. Έτσι, παραπάνω με την εντολή FORALL χρησιμοποιήσαμε 100 επεξεργαστές για να εκτελέσουν την εργασία σε 1010 μονάδες χρόνου, ενώ θα μπορούσαμε να επιτύχουμε το ίδιο με ένα μόνο επεξεργαστή σε 1000 μονάδες χρόνου. Έτσι όχι μόνο αποτύχαμε να επιταχύνουμε την εκτέλεση, αλλά στην πραγματικότητα αυξήσαμε τον χρόνο εκτέλεσης εξαιτίας της γενικής διαδικασίας δημιουργίας της διεργασίας.

Τώρα υποθέστε ότι αντί να έχουμε τόσο μικρό μέγεθος διεργασίας, το σώμα της εντολής FORALL έχει μέγεθος που αντιστοιχεί σε 10000 μονάδες χρόνου. Από τη στιγμή που υπάρχουν ακόμα 100 διεργασίες-παιδιά για να δημιουργηθούν, ο συνολικός χρόνος δημιουργίας της διεργασίας στον Επεξεργαστή 0 παραμένει ο ίδιος με πριν δηλαδή 1000 μονάδες χρόνου. Όμως, η κάθε διεργασία παιδί εκτελείται τώρα για περισσότερο χρόνο, έτσι το δεύτερο στάδιο όπου όλες οι διεργασίες παιδιά εκτελούνται παράλληλα καταναλώνει 10000 μονάδες χρόνου. Επομένως ο συνολικός χρόνος εκτέλεσης της FORALL είναι 11000 μονάδες χρόνου. Αν με αυτά τα δεδομένα χρησιμοποιήσουμε σειριακό βρόχο FOR, τότε η κάθε επανάληψη απαιτεί 10000 μονάδες χρόνου, με αποτέλεσμα ο συνολικός χρόνος εκτέλεσης να απαιτεί 100*10000=1000000 μονάδες χρόνου. Ο λόγος της συνολικής επιτάχυνσης της παράλληλης εντολής FORALL σε σχέση με την σειριακή FOR είναι 1000000/11000=91. Σε αυτή την περίπτωση σε διεργασίες με μεγάλο κύκλο ζωής, έχουμε πετύχει καλή χρήση των επεξεργαστών αφού το πρόγραμμα επιταχύνεται κατά 91 φορές.

Προκειμένου να λυθεί το πρόβλημα του μεγέθους της διεργασίας που δημιουργείται με την εντολή FORALL, η Multi-Pascal διαθέτει ένα γνώρισμα που επιτρέπει πολλές τιμές του πίνακα διεργασιών να ομαδοποιηθούν σε μία και μόνο διεργασία. Για παράδειγμα, στο παραπάνω παράλληλο πρόγραμμα εύρεσης της τετραγωνικής ρίζας, αντί να δημιουργήσουμε 100 διεργασίες μπορούμε να δημιουργήσουμε 10 διεργασίες που να επαναληφθούν για 10 τιμές του πίνακα διεργασιών. Έτσι, υπάρχουν 10 σχετικά μεγάλου μεγέθους διεργασίες αντί για 100 μικρότερου μεγέθους διεργασίες. Στην εντολή FORALL, η δεσμευμένη λέξη GROUPING μπορεί να χρησιμοποιηθεί για να ομαδοποιήσει συγκεκριμένο αριθμό τιμών του πίνακα σε μια διεργασία ως εξής:

 

PROGRAM ParallelSquareroot;
VAR	A :  ARRAY [1..100] OF REAL;
	I :  INTEGER;
 	BEGIN
  .....
  FORALL i := 1 TO 100 GROUPING 10 DO
	A[i] := SQRT( A[i] );
	.....
  END.

Η προσθήκη του GROUPING 10, στην εντολή FORALL, μετατρέπει τις τιμές του πίνακα διεργασιών σε ομάδες των 10 τιμών ανά διεργασία. Έτσι δημιουργούνται μόνο 10 διεργασίες. Η πρώτη διεργασία επαναλαμβάνεται σειριακά για τις τιμές 1 έως 10, η δεύτερη διεργασία επαναλαμβάνεται για τις τιμές 11 έως 20, η τρίτη επαναλαμβάνεται για τις τιμές 21 έως 30 και ούτω καθεξής. Στην πρώτη έκδοση του παράλληλου προγράμματος για την εύρεση της τετραγωνικής ρίζας υπήρχαν 100 διεργασίες που η κάθε μια εκτελούνταν για μικρό χρονικό διάστημα. Στη νέα έκδοση, υπάρχουν 10 διεργασίες που η κάθε μια εκτελείται για μεγαλύτερο χρονικό διάστημα.

Η γενική σύνταξη της εντολής FORALL είναι η ακόλουθη:

 

FORALL <πίνακας διεργασιών> := <αρχική τιμή> TO <τελική τιμή>
{ GROUPING <μέγεθος ομάδος> } DO
	< Σώμα της εντολής >;

όπου τα <αρχική τιμή>, <τελική τιμή> και <μέγεθος ομάδος> μπορούν να πάρουν μόνο ακέραιες τιμές. Όπου υπάρχουν αγκύλες {} σημαίνει ότι το τμήμα που περιέχεται είναι προαιρετική. Εάν η δεσμευμένη λέξη GROUPING παραλείπεται τότε το προκαθορισμένο <μέγεθος ομάδος> είναι 1. Τέλος, εάν το <μέγεθος ομάδος> δεν διαιρείται ακριβώς με τον πίνακα διεργασιών, τότε η τελευταία διεργασία-παιδί περιέχει λιγότερες τιμές από τον μέγεθος της ομάδος.

 

2.1.3 Άριστο Μέγεθος Ομάδος

 

Η εντολή FORALL για την εύρεση της τετραγωνικής ρίζας εκτελέστηκε στον μεταγλωττιστή και στον προσομοιωτή της Multi-Pascal, προκειμένου να φανεί πόσο διαρκεί η εκτέλεση της. Το σύστημα προσομοίωσης μετράει το χρόνο εκτέλεσης από οποιοδήποτε πρόγραμμα της Multi-Pascal χρησιμοποιώντας προσομοιωμένες μονάδες χρόνου, που η κάθε μια αντιστοιχεί σε 1 εκατομμυριοστό του δευτερολέπτου (msec) του χρόνου εκτέλεσης, σε σύστημα με αρχιτεκτονική διαμοιραζόμενης μνήμης και σε επεξεργαστή που έχει ταχύτητα 1 εκατομμύριο εντολές ανά δευτερόλεπτο (MIPS). Η αρχική έκδοση αυτού του προγράμματος με 100 διεργασίες απαιτεί 920 μονάδες χρόνου για να εκτελεστεί. Αυτό είναι ελάχιστα πιο γρήγορο από τη χρήση του σειριακού επαναληπτικού βρόχου FOR, που απαιτεί 1011 μονάδες χρόνου. Όμως, χρησιμοποιώντας την FORALL με πίνακα ομάδων μεγέθους 10, όπως φαίνεται στη νέα έκδοση του προγράμματος παρακάτω, ο χρόνος εκτέλεσης μειώνεται σε 200 μονάδες χρόνου.

Το σχήμα 2.2 δίνει ένα γράφημα του συνολικού εκτελέσιμου χρόνου της ακόλουθης εντολής FORALL όπου το μέγεθος της ομάδας G αυξάνεται από 1 σε 25:

 

 

FORALL i := 1 TO 100 GROUPING  G  DO
		A[i] := SQR(A[i]);

 

executionTime

ΣΧΗΜΑ 2.2 Επίδραση του μεγέθους ομάδας στον χρόνο εκτέλεσης της FORALL

 

Στο πιο αριστερό τμήμα του γραφήματος, το μικρό μέγεθος ομάδας έχει σαν αποτέλεσμα η δημιουργία διεργασιών γονέων να κυριαρχεί τον χρόνο εκτέλεσης. Καθώς το μέγεθος της ομάδας αυξάνεται από 1 σε 5 ο χρόνος δημιουργίας της διεργασιών μειώνεται απότομα. Όμως καθώς το μέγεθος της ομάδας αυξάνει ακόμα περισσότερο ο χρόνος εκτέλεσης των διεργασιών παιδιών αρχίζει να αυξάνει και τείνει τελικά να κυριαρχήσει τον χρόνο εκτέλεσης. Για μέγεθος ομάδας 25, στο πιο δεξιό τμήμα του γραφήματος έχουν δημιουργηθεί μόνο τέσσερις διεργασίες παιδιά. Σε αυτή την περίπτωση, ο χρόνος δημιουργίας της διεργασίας στον γονέα είναι σχετικά μικρός, αλλά κάθε μια από τις διεργασίες παιδιά πρέπει να χειρίζεται 25 αντικείμενα. Στο σχήμα 2.2 παρατηρούμε ότι το βέλτιστο μέγεθος ομάδας φαίνεται να είναι περίπου G=10.

Για να παραχθεί μια γενική αλγεβρική έκφραση του μέγιστου μεγέθους ομάδας σε μια αυθαίρετη FORALL εντολή, ας θεωρήσουμε τους ακόλουθους ορισμούς:

 

n-Συνολικός αριθμός των τιμών του πίνακα στην FORALL.

G-Μέγεθος ομάδας.

c-Χρόνος δημιουργίας κάθε διεργασίας.

T-Χρόνος εκτέλεσης της εντολής μέσα στην FORALL.

 

Χρησιμοποιώντας αυτές τις παραμέτρους βρίσκουμε ότι ο συνολικός αριθμός των διεργασιών-παιδιών που δημιουργούνται είναι n/G. Ο συνολικός χρόνος δημιουργίας όλων των διεργασιών είναι επομένως cn/G. H κάθε διεργασία εκτελεί 6 φορές την εντολή μέσα στην FORALL. Επομένως ο χρόνος εκτέλεσης κάθε διεργασίας είναι GT. Από την στιγμή που όλες οι διεργασίες εκτελούνται παράλληλα, ο συνολικός χρόνος εκτέλεσης για την FORALL έχει ως εξής:

 

codeImage + GT

 

Για να ελαχιστοποιηθεί ο χρόνος εκτέλεσης σε σχέση με το G, απλά παίρνουμε την πρώτη παράγωγο ως προς G και την θέτουμε ίση με το 0. Το αποτέλεσμα είναι το ακόλουθο:

 

G=codeImage

 

Στο παράδειγμα του σχήματος 2.2, προκύπτει ότι το c και το T είναι περίπου τα ίδια. Μέχρι που το Ν=100 ο παραπάνω τύπος δίνει το βέλτιστο μέγεθος ομάδας που είναι G=10. Ευτυχώς, ο συνολικός χρόνος εκτέλεσης αυξάνει σταδιακά με μεγάλους ρυθμούς καθώς η τιμή του G κυμαίνεται γύρω από την βέλτιστη της τιμή. Αυτό φαίνεται καθαρά στο σχήμα 2.2. Επομένως δεν είναι απαραίτητο να υπολογιστεί το G με ακρίβεια - μια κατά προσέγγιση εκτίμηση μπορεί να είναι επαρκής για τα περισσότερα προγράμματα. Για τις εντολές FORALL που έχουν πολύ μικρό σώμα ένας καλός γενικός κανόνας για να μην δημιουργούνται προβλήματα, είναι να χρησιμοποιείται απλά ένα μέγεθος ομάδας ίσο με την τετραγωνική ρίζα του συνολικού αριθμού τιμών στον πίνακα. Για βρόχους με μεγάλο σώμα εντολών η ομαδοποίηση μπορεί να μην είναι αναγκαία.

Μια άλλη περίπτωση για να χρησιμοποιηθεί το GROUPING, είναι όταν ο αριθμός των παράλληλων διεργασιών ξεπερνάει κατά πολύ των συνολικό αριθμό των διαθέσιμων φυσικών επεξεργαστών στο συγκεκριμένο παράλληλο σύστημα. Για παράδειγμα ας θεωρήσουμε την ακόλουθη FORALL εντολή:

 

FORALL i := 1 TO 100 DO
		Compute(i);

 

Αν υποθέσουμε ότι η διαδικασία Compute έχει σχετικά μεγάλο μέγεθος φαίνεται να μην υπάρχει λόγος να χρησιμοποιηθεί οποιαδήποτε ομαδοποίηση πίνακα σε αυτή την εντολή. Υποθέτουμε τώρα, ότι το συγκεκριμένο σύστημα διαμοιραζόμενης μνήμης έχει μόνο 20 φυσικούς επεξεργαστές. Η μια λύση είναι να ανατεθούν πέντε διεργασίες στον κάθε φυσικό επεξεργαστή. Το σύστημα τότε θα καταναλώσει επιπλέον χρόνο για να δημιουργήσει όλες αυτές τις διεργασίες, και θα χρειαστεί επιπλέον χρόνο για να μεταφερθεί ο φυσικός επεξεργαστής από μια διεργασία στην επόμενη. Αν ο προγραμματιστής ξέρει κατά τη διάρκεια ανάπτυξης του προγράμματος, ότι μόνο 20 φυσικοί επεξεργαστές είναι διαθέσιμοι, μπορεί να μειώσει αρκετά αυτή τη σπατάλη χρησιμοποιώντας την ιδιότητα GROUPING με τον ακόλουθο τρόπο.

 

FORALL i := 1 TO 100 GROUPING 5 DO
		Compute(i);

 

Αυτή η εντολή παράγει ακριβώς 20 παράλληλες διεργασίες, που κάθε μια έχει πέντε τιμές στον πίνακα. Η διεργασία ανατίθεται αυτόματα σε έναν από τους 20 διαθέσιμους φυσικούς επεξεργαστές. Ο συνολικός χρόνος δημιουργίας της διεργασίας μειώνεται με αυτό τον τρόπο κατά πέντε φορές, και οι φυσικοί επεξεργαστές δεν σπαταλούν καθόλου χρόνο με το να μετακινούνται ανάμεσα στις διεργασίες.


     Next              Up                Back               Contents

Επόμενο:2.2 Παράδειγμα : Παράλληλη Ταξινόμηση Πάνω:Κεφάλαιο 2ο: Παραλληλισμός Δεδομένων Πίσω:Κεφάλαιο 2ο: Παραλληλισμός Δεδομένων