Next              Up                Back              Contents 

Επόμενο:2.6 Ο τελεστής FORK Πάνω:Κεφάλαιο 2ο: Παραλληλισμός Δεδομένων Πίσω:2.4 Παράδειγμα : Πολλαπλασιασμός μητρών


2.5 Διαμοιραζόμενες και Τοπικές Μεταβλητές

 

Σε αυτό το σημείο είναι σημαντικό να κατανοηθεί γιατί ο υπολογισμός του εσωτερικού γινομένου, στο παραπάνω παράλληλο πρόγραμμα πολλαπλασιασμού μητρών ενσωματώθηκε σε μια διαδικασία. Ο λόγος έχει να κάνει με τη χρήση των μεταβλητών sum και k κατά τον υπολογισμό του παραγόμενου ανύσματος. Είναι απαραίτητο για κάθε παράλληλη διεργασία να έχει το δικό της αντίγραφο αυτών των μεταβλητών γιατί χρησιμοποιούνται για προσωρινή αποθήκευση. Οι φωλιασμένες εντολές FORALL στο σώμα του κυρίως προγράμματος δημιουργούν 100 παράλληλες διεργασίες. Σε κάθε διεργασία ανατίθεται ο υπολογισμός του ανύσματος που προκύπτει από μια συγκεκριμένη γραμμή της μήτρας A με μια συγκεκριμένη στήλη της μήτρας B. Κάθε τέτοια διεργασία χρησιμοποιεί τις μεταβλητές sum και k κατά τη διάρκεια του υπολογισμού που της ανατίθεται. Όσο διαρκεί ο υπολογισμός του εσωτερικού ανύσματος, οι μεταβλητές αυτές διαβάζονται και τροποποιούνται σε κάθε επανάληψη του βρόχου.

Θεωρείστε το παρακάτω λανθασμένο παράλληλο πρόγραμμα μέσα στο οποίο ο υπολογισμός του εσωτερικού γινομένου δεν πραγματοποιείται σε μια ξεχωριστή διαδικασία:

 

PROGRAM ErroneousMatrixMultiply;
 CONST  n=100;
 VAR	A, B, C : ARRAY [1..n,1..n] OF REAL;  
		i, j, k : INTEGER;
		sum : REAL;
  BEGIN
  .....
  FORALL i := 1 TO n DO
		FORALL j := 1 TO n DO
	  		BEGIN
				sum := 0;
	  	  			FOR k := 1 TO n DO
						sum := sum + A[i, k]*B[k, j];
						C[i, j] := sum;
	  		END;
  .....
  END.

 

Σε αυτό το λανθασμένο πρόγραμμα, δημιουργούνται 100 παράλληλες διεργασίες, μια για κάθε συνδυασμό των μετρητών i και j. Αφού η μεταβλητή sum δηλώνεται στην αρχή του κυρίως προγράμματος είναι μια διαμοιραζόμενη μεταβλητή. Υπάρχει ένα μόνο αντίγραφο της sum που είναι κοινό και στις 100 διεργασίες. Η εκτέλεση του κώδικα από κάθε επεξεργαστή απαιτεί και την χρήση της μεταβλητής sum μέσα στον βρόχο FORALL. Κάθε φορά μια νέα τιμή προστίθεται στην sum και στην επόμενη επανάληψη του βρόχου η τιμή αυτή χρησιμοποιείται για να διαβάσει. Με 100 διεργασίες να προσπαθούν να χρησιμοποιήσουν το κελί sum της διαμοιραζόμενης μνήμης, προκύπτουν παρεμβολές. Η τιμή που γράφεται από μια διεργασία, γρήγορα μεταβάλλεται από άλλες διεργασίες και έτσι καμία δεν μπορεί να υπολογίσει σωστά το αποτέλεσμα της.

Για να λειτουργήσει σωστά το πρόγραμμα, κάθε διεργασία χρειάζεται να έχει ένα μοναδικό, τοπικό αντίγραφο της μεταβλητής sum. Αυτό πετυχαίνεται με την χρήση της διαδικασίας VectorProduct όπως φαίνεται παραπάνω και στην οποία η μεταβλητή sum δηλώνεται στην αρχή της διαδικασίας. Κατ’ αυτόν τον τρόπο κάθε διεργασία θα αποκτήσει ένα τοπικό αντίγραφο της sum όταν καλεί την διαδικασία. Αντί λοιπόν για ένα αντίγραφο της sum υπάρχουν πλέον 100 αντίγραφα και δεν υπάρχουν παρεμβολές στον υπολογισμό του ανύσματος που ανατίθεται σε κάθε επεξεργαστή. Ακόμα οι μήτρες A, B και C εξακολουθούν να διαμοιράζονται σε όλους τους επεξεργαστές χωρίς όμως να υπάρχουν παρεμβολές. Οι επεξεργαστές διαβάζουν μόνοι τους τις μήτρες Α και Β χωρίς να μπορούν να γράψουν σε αυτούς και έτσι αποφεύγονται τα σφάλματα (παρόλο που ορισμένοι επεξεργαστές μπορεί να έχουν πρόβλημα καθυστερημένης πρόσβασης). Μόνο στη μήτρα C εκχωρούνται τιμές από τους επεξεργαστές αλλά ο κάθε ένας γράφει σε διαφορετικό στοιχείο της μήτρας, και έτσι αποφεύγονται τα σφάλματα στα στοιχεία της C.

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

 

2.5.1 Ομάδες Εντολών με Δηλώσεις Μεταβλητών

 

Επειδή η δημιουργία τοπικών μεταβλητών είναι πολύ σημαντική στα παράλληλα προγράμματα, η Multi-Pascal έχει μια πρόσθετη ιδιότητα γιαυτό το σκοπό: τις ομάδες εντολών με δηλώσεις μεταβλητών. Αυτή η ιδιότητα επιτρέπει σε οποιαδήποτε σειρά εντολών να μετατραπεί σε μια δέσμη με τις δικές της δηλώσεις τοπικών μεταβλητών. Η παραπάνω ιδιότητα υπάρχει και σε πολλές άλλες γλώσσες προγραμματισμού όπως η C και η Algol αλλά δεν υπάρχει στην απλή Pascal. Στη Multi-Pascal η δημιουργία μιας ομάδας εντολών με τις δηλώσεις των τοπικών μεταβλητών γίνεται απλά με την ομαδοποίηση των εντολών σε ένα ζευγάρι δεσμευμένων λέξεων Begin-End που έπεται ένα απλό τμήμα δηλώσεων μεταβλητών (VAR τμήμα). Στο παρακάτω τμήμα προγράμματος φαίνεται η χρήση της ομάδας εντολών:

 

PROGRAM Sample;
 VAR  A: ARRAY [1..10,1..10] OF REAL;
		x,p:REAL;
             ...

  BEGIN(*Σώμα Κυρίως προγράμματος*)
             ...
  x := A[i,]*3;
  p := Sqrt(x);
  VAR x,y: INTEGER; (* Aρχή της ομάδας εντολών*)
      value:REAL;
    BEGIN
		value := 1;
	  		FOR x := 1 TO 10 DO
    			FOR y := 1 TO 10 DO
					BEGIN
		  				A[x,y] := value;
		  				value := value * 2;
					END;
    END; (*Τέλος της ομάδας εντολών*)
Writeln(x);(* Αναφέρεται στο x που δηλώνεται στην αρχή του προγράμματος*) 
Writeln(A[1,1]);
     ...
END.

 

Στο παραπάνω τμήμα του προγράμματος, οι δύο αρχικές αναθέσεις τιμών στις μεταβλητές x και p εκτελούνται πρώτες. Αυτές οι μεταβλητές και ο πίνακας Α ορίζονται στο κυρίως τμήμα δηλώσεων στην αρχή του προγράμματος. Η ομάδα εντολών μέσα στο σώμα του κυρίως προγράμματος κάνει την εμφάνιση της μετά τις αρχικές αναθέσεις τιμών στις μεταβλητές x και p. Ακριβώς σε αυτό το σημείο, η δεσμευμένη λέξη VAR στη αρχή της ομάδας εντολών θα προκαλέσει τη δημιουργία ενός νέου τοπικού περιβάλλοντος που περιέχει τις μεταβλητές που ορίζονται στις δηλώσεις. Έπειτα εκτελούνται οι εντολές που περιέχονται μέσα στην ομάδα (δηλαδή ανάμεσα στο BEGIN-END), χρησιμοποιώντας το νέο τοπικό περιβάλλον. Τα τμήματα VAR και BEGIN-END μέσα στο κυρίως πρόγραμμα καλούνται ομάδες εντολών.

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

Σε αυτό το παράδειγμα οι μεταβλητές value και y εμφανίζονται μόνο μέσα στην τοπική ομάδα εντολών. Η δήλωση της μεταβλητής x μέσα στην ομάδα εντολών παραγκωνίζει τον εξωτερικό ορισμό της μεταβλητής x έξω από την ομάδα εντολών, οποιαδήποτε αναφορά στη μεταβλητή x αφορά την μεταβλητή τύπου REAL που δηλώθηκε στην αρχή του προγράμματος. Ωστόσο η αναφορά του x μέσα στην ομάδα εντολών αφορά την ακέραια μεταβλητή που δηλώθηκε στην αρχή της ομάδας εντολών. Όταν η ομάδα εντολών ολοκληρωθεί η εντολή Writeln(x) θα εμφανίσει την προηγούμενη τιμή της x όπως αυτή προέκυψε πριν από την εκτέλεση της ομάδας εντολών.

Όταν μια ομάδα εντολών τερματίζεται, όλες οι τοπικές μεταβλητές καταστρέφονται όπως ακριβώς συμβαίνει όταν μια διαδικασία τερματίζεται. Αφού οι τοπικές μεταβλητές x, y και value χάνονται με τον τερματισμό της ομάδας, η μόνη επίδραση της ομάδας είναι οι αλλαγές στα περιεχόμενα του πίνακα Α που δηλώθηκε στην αρχή του προγράμματος. Η εντολή Writeln A[1,1] στο τέλος του προγράμματος, θα εμφανίσει τις νέες τιμές που ανατέθηκαν στον πίνακα. Η γενική μορφή της ομάδας εντολών με τις δηλώσεις των τοπικών μεταβλητών είναι η ακόλουθη:

 

VAR <declaration 1>;
    <declaration 2>;
     ...
    <declaration m>;  
 BEGIN
    <statement 1>;
    <statement 2>;
     ...
    <statement n>;
 END;

 

Η ομάδα εντολών θεωρείται μια απλή σύνθετη πρόταση και μπορεί να εμφανιστεί οπουδήποτε επιτρέπεται μια απλή πρόταση Multi-Pascal. Οι ομάδες εντολών μπορούν να είναι φωλιασμένα και μπορεί να εμφανιστούν στο σώμα διαδικασιών και συναρτήσεων. Ωστόσο το αντίθετο δεν συμβαίνει οι διαδικασίες και οι συναρτήσεις δεν μπορούν να οριστούν στο εσωτερικό μιας ομάδας- όπου μπορούν να οριστούν μόνο μεταβλητές. Όταν κατά την εκτέλεση ενός προγράμματος παρουσιάζεται μια ομάδα εντολών, συμπεριφέρεται όπως ακριβώς το σώμα μιας διαδικασίας που καλείται εκείνη τη στιγμή. Οι δηλώσεις δημιουργούν ένα τοπικό περιβάλλον που καταστρέφεται μετά την εκτέλεση των εντολών που περιέχονται στις ομάδες. Η ισχύ για τις τοπικές δηλώσεις μεταβλητών περιορίζεται μέσα στις ομάδες εντολών. Η κλήση μιας διαδικασίας ή συνάρτησης μέσα στην ομάδα εντολών θα γίνει δεκτή προσωρινά μέσα στο σώμα της διαδικασίας το οποίο είναι έξω από την εμβέλεια των δηλώσεων της τοπικής ομάδας εντολών.

Θυμηθείτε από προηγούμενα, ότι όταν μια διεργασία εκτελεί μια κλήση διαδικασίας, η διεργασία παίρνει ένα δικό της μοναδικό αντίγραφο των τοπικών μεταβλητών που έχουν δηλωθεί σε αυτή τη διαδικασία. Αν πολλές διεργασίες καλούν την ίδια διαδικασία, κάθε μια παίρνει το δικό της ιδιωτικό αντίγραφο των τοπικών μεταβλητών της διαδικασίας. Αυτό φαίνεται στο πρόγραμμα Ταξινόμησης Σειράς του Σχήματος 2.3: όταν οι παράλληλες διεργασίες καλούν την διαδικασία PutinPlace, κάθε μια παίρνει το δικό της ιδιωτικό αντίγραφο από τις μεταβλητές testval, j, rank. Υπάρχει ένας παρόμοιος κανόνας αναφορικά με την εκτέλεση της ομάδας εντολών από πολλαπλές διεργασίες. Όποτε, μια διεργασία ξεκινάει την εκτέλεση της ομάδας εντολών με τις τοπικές δηλώσεις, δημιουργείται ένα καινούργιο ιδιωτικό σύνολο από τοπικές μεταβλητές γιαυτή τη διεργασία. Οπότε, αν παράλληλες διεργασίες εκτελούν την ίδια ομάδα εντολών, κάθε μια θα έχει το δικό της σύνολο από μεταβλητές οι οποίες έχουν δηλωθεί τοπικά σε αυτή την ομάδα εντολών.

Η κύρια εφαρμογή των ομάδων εντολών στη Multi-Pascal, είναι στο σώμα της εντολής FORALL. Θυμηθείτε το Parallel Matrix Multiply (πρόγραμμα) που συζητήσαμε στην προηγούμενη παράγραφο. Σε αυτό το πρόγραμμα η διαδικασία VectorProduct χρησιμοποιείται για την δημιουργία των απαραίτητων τοπικών μεταβλητών sum και k που χρησιμοποιούνται από κάθε παράλληλη διεργασία. Η διαδικασία αυτή τώρα μπορεί να αντικατασταθεί από μια ομάδα εντολών όπως φαίνεται παρακάτω.

 

1   PROGRAM ParallelMatrixultiply_2;
2    CONST n = 10;
3    VAR A, B, C:  ARRAY [1..n, 1..n] OF REAL;
4	   		i, j: INTEGER;
5     BEGIN
       ...

6     FORALL  i := 1 TO n DO 
7         FORALL  j := 1 TO n DO
8           VAR sum: REAL;
9               k: INTEGER;
10    	BEGIN
11             sum := 0;
12                FOR k  :=   1 TO n DO
13			    	sum := sum+ A[i,k] * B[k, j];
14			    	C[i, j] := sum;
15        END;
          ...

 

Σε αυτή την καινούργια έκδοση του προγράμματος, υπάρχουν 100 παράλληλες διεργασίες που δημιουργούνται από τις φωλιασμένες εντολές FORALL. Κάθε μια από αυτές τις παράλληλες διεργασίες ξεκινάει την εκτέλεση της στη γραμμή 8, που είναι το τμήμα δηλώσεων της ομάδας εντολών. Κάθε διεργασία καθώς ξεκινάει θα δημιουργεί επομένως το δικό της τοπικό αντίγραφο για τις μεταβλητές sum και k πριν εκτελέσει τις γραμμές 11-14. Σε αυτό το πρόγραμμα δεν υπάρχουν καθόλου παρεμβάσεις ανάμεσα στις διεργασίες, και έτσι παράγεται σωστό αποτέλεσμα. Πραγματικά η κάθε διεργασία παίρνει τέσσερις μεταβλητές: i, j, sum, k. Οι φωλιασμένες FORALL εντολές δίνουν αυτόματα σε κάθε διεργασία ένα τοπικό αντίγραφο των μετρητών i, j με την κατάλληλη αρχική τιμή. Οι δηλώσεις της ομάδας εντολών είναι υπεύθυνες για να δώσουν σε κάθε διεργασία τοπικό αντίγραφο των μεταβλητών sum, k.

Αυτή η ιδιότητα η ομάδα εντολών χρησιμοποιείται πολύ στους FORALL βρόχους. Χωρίς ομάδα εντολών στους βρόχους FORALL, η κάθε μεταβλητή που μεταβάλλεται μέσα στον βρόχο, πρέπει να αναφέρεται σαν πίνακας που να χρησιμοποιεί την μεταβλητή του βρόχου σαν μετρητή. Η προσπάθεια να μεταβάλλουμε οποιαδήποτε πρωτογενή μεταβλητή μέσα στην FORALL θα έχει σαν αποτέλεσμα όλες οι υπάρχουσες διεργασίες να μεταβάλλουν την ίδια μεταβλητή, προκαλώντας έτσι παρεμβολές όπως και στο παράδειγμα MatrixMultiply που περιγράψαμε παραπάνω. Όμως, η χρήση της ομάδας εντολών με τοπικές δηλώσεις επιτρέπει κάθε διεργασία FORALL να έχει το δικό της τοπικό αντίγραφο των μεταβλητών που πρόκειται να μεταβληθούν.

Αυτό το πρόβλημα με τις εντολές FORALL μπορεί επίσης να ξεπεραστεί με το να εισάγουμε μια κλήση διαδικασίας μέσα στην FORALL, όπως ακριβώς παρουσιάστηκε στο πρόγραμμα Parallel Matrix Multiply. Αυτή η τεχνική χρησιμοποιήθηκε και στο πρόγραμμα Rank Sort του Σχήματος 2.3. Καλώντας στην γραμμή 21 την διαδικασία PutinPlace, η κάθε διεργασία θα έχει το δικό της τοπικό αντίγραφο από τις τοπικές μεταβλητές που ορίζονται σε αυτή τη διαδικασία. Η χρήση της ομάδας εντολών μέσα στις εντολές FORALL αντικαθιστά τον επιπλέον κώδικα που απαιτείται για τον ορισμό μιας ολόκληρης ανεξάρτητης διαδικασίας, και αυτό θα είναι πολύ βολικό για μερικά προγράμματα.

 

2.5.2 Εμβέλεια των Μετρητών της FORALL

 

Θυμηθείτε ότι η κάθε διεργασία που δημιουργείται από την εντολή FORALL παίρνει ένα δικό της μοναδικό, τοπικό αντίγραφο της μεταβλητής μετρητή του βρόχου. Αυτή η μεταβλητή μετρητή πρέπει να δηλώνεται έξω από την FORALL, αλλά συμπεριφέρεται σαν να είχε δηλωθεί τοπικά μέσα στην κάθε διεργασία. Στην πραγματικότητα, η σημασία της συμπεριφοράς του μετρητή στον βρόχο FORALL είναι ακριβώς η ίδια με την σημασία που θα υπήρχε αν ο μετρητής ορίζονταν στην τοπική ομάδα εντολών της κάθε διεργασίας, ανεξάρτητα από το γεγονός ότι ο μετρητής παίρνει μοναδική αρχική τιμή σε κάθε διεργασία. Για παράδειγμα, στο πρόγραμμα ParallelMatrixMultiply_2 οι μετρητές i, j της FORALL πρέπει να δηλωθούν σαν καθολικές μεταβλητές στη γραμμή 4 του προγράμματος. Όμως μέσα στον βρόχο FORALL και στις εντολές 8-15, αυτοί οι μετρητές συμπεριφέρονται σαν να είχαν δηλωθεί τοπικά μέσα στο ομάδες εντολών μαζί με τις μεταβλητές sum, k. Αυτό σημαίνει ότι η εμβέλεια των τοπικών μετρητών της FORALL περιορίζεται στο σώμα εντολών της FORALL.

Μελέτησε το παρακάτω τμήμα προγράμματος:

 

PROGRAM Sample;
 VAR i: INTEGER;             
PROCEDURE Tree;
  BEGIN 
   ...
  END;
  BEGIN
  ...
    FORALL i := 1 TO 20 DO
		BEGIN
		 ...
	  		Tree;
		END;
		...
  END.

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

Αναφερόμενοι και πάλι στο παράλληλο πρόγραμμα Rank Sort του Σχήματος 2.3, βλέπουμε ότι η κλήση διαδικασίας σε κάθε διεργασία έχει την μορφή ‘’PutinPlace(i)’’. Ο FORALL μετρητής i πρέπει να οριστεί ρητά στην διαδικασία σαν μια παράμετρος εξαιτίας του κανόνα τοπικής εμβέλειας. Παρόμοια στο παράλληλο πρόγραμμα Matrix Multiply του τμήματος 2.4 η κλήση διαδικασίας έχει την μορφή VectorProduct(i,j). Τα i και j είναι μετρητές στην δήλωση FORALL και επομένως πρέπει να οριστούν ρητά σαν παράμετροι ης διαδικασίας.

Οι μετρητές της FORALL έχουν ιδιαίτερες ιδιότητες και συμπεριφέρονται με ιδιαίτερο τρόπο στην Multi-Pascal. Κάθε φορά που η διεργασία δημιουργείται και της εκχωρείται η μοναδική τιμή της από τον μετρητή της FORALL αυτή η τιμή δεν μπορεί να αλλάξει μέσα στη διεργασία. Οποιαδήποτε προσπάθεια αλλαγής αυτού του μετρητή στην δήλωση εκχώρησης τιμής θα προκαλέσει λάθος μεταγλώττισης. Ο μετρητής της FORALL δεν πρέπει να χρησιμοποιηθεί σαν παράμετρος της εντολής READ ούτε και να οριστεί σαν VAR παράμετρος σε διαδικασίες ή συναρτήσεις. Γενικά μπορεί να χρησιμοποιηθεί σε οποιοδήποτε πλαίσιο αρκεί να μην αλλάζει η τιμή του. Έτσι μπορεί να χρησιμοποιηθεί σε οποιαδήποτε έκφραση της Multi-Pascal ή ακόμα και για την αρίθμηση ενός πίνακα. Επίσης μπορεί να οριστεί σαν παράμετρος τιμής σε οποιαδήποτε διαδικασία ή συνάρτηση όπως στο παράλληλο πρόγραμμα Ταξινόμησης Σειράς και στο πρόγραμμα Πολλαπλασιασμού Μητρών.

 


     Next              Up                Back              Contents 

Επόμενο:2.6 Ο τελεστής FORK Πάνω:Κεφάλαιο 2ο: Παραλληλισμός Δεδομένων Πίσω:2.4 Παράδειγμα : Πολλαπλασιασμός μητρών