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

spazokefalia.....


athanatos

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

Δημοσ.

λοιπόν έχω μπροστά μου έναν αλγόριθμο sum ο οποίος είναι για εκτέλεση σε παράλληλα συστήματα.

 

Η εκφώνηση λέει

Είσοδος:Ένα διάνυσμα αριθμών A[1...n], n=2^k (2 στην k) αποθηκευμένο σε μία pram με p=2^m (2 στην m) επεξεργαστές (k και m είναι ακέραιοι αριθμοί)

 

Έξοδος:Το άθροισμα των n αριθμών ,αποθηκευμένο στο A[1]

 

(το i είναι ο αριθμός του εκάστοτε επεξεργαστή .Ο πρώτος cpu έχει i=1 kok)

 

ο αλγόριθμος είναι

 

begin

1.sum:=0

2.for h:=(i-1)n/p to in/p do

begin

global_read(A[h],w)

sum:=sum+w

end

3.global_write(sum,A)

4.for j:=1 to log p do

if (i<=p/2^j) then

begin

global_read(A[2i-1],x)

global_read(A[2i],y)

z:=x+y

global_write(z,A)

end

end

 

 

ps η εντολή global_read(A,x) αντιγράφει την τιμή της μεταβλητής Α της κοινής μνήμης στην μεταβλητή x της τοπικής.

η εντολή global_write(y,B) αντιγράφει την μεταβλητή y που βρίσκεται στην τοπική μνήμη στην μεταβλητή A που βρίσκεται στην κοινή μνήμη.

 

 

Η απορία μου είναι η εξής

Αν τρέξουμε τον αλγόριθμο για n=16 και p=4

ο επεξεργαστής i=1 (πρώτος) θα γράψει

2.for h:=(1-1)*16/4 to 1*16/4 do

δηλαδή for h=0 to 4

και θα διαβάζει τις θέσεις (μέσω της global_read(A[h],w))

Α[0] Α[1] Α[2] Α[3] Α[4]

πρώτη απορία .Η εκφώνηση λέει πως το πρώτο στοιχείο του πίνακα είναι το Α[1] όχι το Α[0]

Κάθε cpu πρέπει να διαβάζει 4 στοιχεία απο τον πίνακα γιατι n/p=16/4=4

και όχι 5 που διαβάζει ο αλγόριθμος.....

 

Τι έχετε να πείτε.

Δημοσ.
se ti glossa??

 

Χαχαχα.

 

Η αλήθεια είναι ότι μας έμπλεξες λίγο...

Δεν ανεβάζεις κάπου το αρχείο να το δουλέψω... :roll:

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...