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

Ερμηνεία προγράμματος C (mpi)


if_then_else

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

Καλησπέρα σας,

 

παρακολουθώ πολύ καιρό το forum σας, αλλά γράφω πρώτη φορά.

 

Είμαι φοιτητής του ΤΕΙ Πληροφορικής και στο εργαστήριο του παράλληλου προγραμματισμού μας βάλανε να εξηγήσουμε τι κάνει ένα πρόγραμμα...

 

Το πρόγραμμα είναι το παρακάτω:

http://www.theese.com/c++/parallel_gaussian_elimination.html

 

Πρακτικά υπολογίζει την εξίσωση Gauss με προς τα πίσω αντικατάσταση, αφού πρώτα φτιάξει άνω τριγωνικό πίνακα (και αν χρειαστεί κάνει partial pivoting για να μην χρειαστεί να διαιρέσει με το 0).

 

Το πρόβλημα μου είναι ότι δεν ξέρω καθόλου C και θα κοπώ αν δεν κάνω αυτή την εργασία.

Δεν μπορώ να καταλάβω γενικά τι κάνει το πρόγραμμα (πως στέλνει στις άλλες διεργασίες) ή και ακόμα τι κάνουν οι μεταβλητές μόνες τους (πχ το perm_vector)...

 

Υπάρχει κάποιος που να ξέρει να μου εξηγήσει;

Το πρόγραμμα το έτρεξα και λειτουργεί αν και έβγαλα το θέμα της επαλήθευσης (βιβλιοθήκη math και numerator, denumeraton κλπ)

 

Αν δεν μπορεί να το κάνει κάποιος ή είναι μεγάλος κόπος είμαι διατεθιμένος να δώσω κάποια χρήματα, γιατί όπως σας είπα είναι ζήτημα ζωής ή θανάτου το να μην κοπώ σε αυτό το εργαστήριο (ιδίως από το 2ο μάθημα)...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

perm_vector μάλλον σημαινει permutation vector και είναι συνήθως ένας πίνακας που όλοι του οι vectors , σειρές αποτελούνται απο ενα 1 και τα υπολοιπα 0

 

γραμμική αλγεβρα ξέρεις;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

To my_a ειναι διπλος δείκτης. Ένας δείκτης σε δείκτη.

Χρησιμοποιούμε τους δείκτες σαν special μεταβλητες ωστε να αποθηκεύσουμε μεσα

σε αυτούς τις διευθύνσεις μνήμης κάποιων άλλων μεταβλητων.

 

Δεν υπάρχει περιορισμος στο που θα δειχνει ένας δεικτης αρκει να δειχνει σε δεδομένα τύπου

σαν αυτά που έχει στην δηλωση του (στην περιπτωση σου double) .

 

Mε την malloc με ενα προχειρο ψάξιμο ειδα οτι δεσμεύεις μνήμη τοση οση ειναι η παρασταση μεσα στην παρένθεση

εδω θα δεσμεύσεις πχ οσο πιανει ο double σου επι την μεταβλητή order. H malloc θα εκχωρήσει στον δείκτη my_b την διεύθυνση

της αρχης του χώρου που δέσμευσε.

 

Η order θα έχει μια τιμή όταν δεν θα μπει πια στο loop και η ροη του κωδικα θα συνεχισει παρακατω .... Πχ αν έχεις ενα loop

 

>

int i = 0 , order = 5;

for ( ; i < order i++ )
statement ;

 

Για i = 5 δεν θα μπεις στο loop να εκτελέσεις το statement επειδη ο έλεγχος i < order θα δωσει FALSE αρα η order θα ειναι 5 μετα πιο κατω..... αν χρησιμοποιηθεί ας πουμε σε κάποια αλλη εντολή θα έχει την τιμή 5.

Πιθανολογω οτι το σημειο αυτο πάει να δεσμεύσει μνήμη οση θα θέλει για τον πινακα σου.... πχ για 10 στοιχεια... οπου γενικα στα arrays ξεκινά απο 0 μέχρι n-1..... a[0] ..... a[9] αλλα τα στοιχεια ειναι 10 επειδη ξεκινα η αριθμηση απο το 0.

 

P.S Βάλε ακριβως κατω απο την τελευταια αγκυλη που κλεινει το σώμα του for-loop μια printf να δεις τι τιμη θα έχει η order....

 

>
printf (" value of order : %d " , order ) ;

 

P.S2 Ελα ρε... παιζει μπαλίτσα και στην C ο Gauss ? :P Να αρχισω να φανταζομαι καναν κώδικα που υπολογιζει τον λευκο προσθετικο θορυβο σε τιποτα ψηφιακές... κανα κερδος κεραιας δεκτη κτλπ???? μπραβο.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Γραμμική άλγεβρα ξέρω.. Το τι πραγματοποιείται το ξέρω, πως γίνεται λόγω προγραμματισμού δεν ξέρω.

Τι κάνει το my_a, το my_b κλπ..

 

Πάλι καλά, αλλιώς θα είχαμε πρόβλημα

 

φαντάζομαι και ελπίζω ότι ξέρεις ή διατίθεσε να μάθεις τα βασικά ( control structures , stdlib , πως να κάνεις compile , κτλ )

 

για να βοηθήσω, θα πρέπει να μάθεις λίγη C ...

 

πάρε τον κώδικα από το http://www.theese.co...limination.html και βάλτο σε κανα pastebin ή gist

ταραξέ το στα σχόλια τι καταλαβαίνεις τι δεν καταλαβαίνεις ... αυτά που δεν καταλαβαίνεις μαρκαρέ τα με κάτι αρκετα μοναδικό

που θα είναι εύκολο να βρεί κάποιος με μια αναζήτηση ... αρχισε να κάνεις post τις απορίες απο τήν αρχή με αριθμό γραμμής

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Για αρχή είχα κάνει τον κώδικα λίγο πιό απλό

http://pastebin.com/iYE7Xwes

 

Από C έχω μία ιδέα γενικά.

Το θέμα είναι ειδικά δεν καταλαβαίνω εδώ.

Γενικά δεν καταλαβαίνω τι κάνει το πρόγραμμα, όπως και ειδικά η κάθε μεταβλητή.

(Όπως η perm_vector για παράδειγμα)...

Με βλέπω να κόβομαι με συνοπτικές διαδικασίες....

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Για αρχή είχα κάνει τον κώδικα λίγο πιό απλό

http://pastebin.com/iYE7Xwes

 

Από C έχω μία ιδέα γενικά.

Το θέμα είναι ειδικά δεν καταλαβαίνω εδώ.

Γενικά δεν καταλαβαίνω τι κάνει το πρόγραμμα, όπως και ειδικά η κάθε μεταβλητή.

(Όπως η perm_vector για παράδειγμα)...

Με βλέπω να κόβομαι με συνοπτικές διαδικασίες....

 

Καλύτερα να βάλεις τον κώδικα στο ideone.com επειδη διαθέτει και built-in compiler.

 

>

temp = perm_vector[i];	

perm_vector[i] = perm_vector[pivot_row];	

perm_vector[pivot_row] = temp;	

 

Αν εννοείς αυτο εδώ... τοτε κάνει απλά ενα swapping , ανταλλάσει τις τιμές του perm_vector με perm_vector[pivot_row]

και το αντίστροφο. Για να μην χαθεί ομως η τιμή θα πρέπει πρωτα να την βάλει σε μια προσωρινή μεταβλητη την temp.

 

Πχ έχω δυο μεταβλητές x και y με τιμές 1 και 2 αντίστοιχα και θέλω μετα το swapping η x να έχει την 2 και η y την 1

αν πάω ομως να βάλω απευθείας την y στην x ... θα χάσει η x την τιμή της πριν προλάβει να μπει στην y.

 

Για αυτο θα βάλω πρώτα την x σε μια προσωρινή... μετα θα βάλω την y στην x και τέλος την x στην y (την οποία φυσικά έχω κρατήσει φυλαγμένη στην προσωρινή )

 

Δηλαδη

 

>

temp = x;
x = y ;
y = temp;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Παιδιά, αν κάποιος το καταλαβαίνει το πρόγραμμα και μπορεί να βοηθήσει, είτε με ένα κείμενπ, είτε από κοντά, είτε Skype, είτε οπωσδήποτε και του δίνω και χρήματα.. Είμαι λίγο απελπισμένος όπως βλέπετε

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Παιδιά, αν κάποιος το καταλαβαίνει το πρόγραμμα και μπορεί να βοηθήσει, είτε με ένα κείμενπ, είτε από κοντά, είτε Skype, είτε οπωσδήποτε και του δίνω και χρήματα.. Είμαι λίγο απελπισμένος όπως βλέπετε

 

αυτό με το perm_vector το κατάλαβες? πώς μοιάζει ένα matrix.txt ?

 

Πόσο χρόνο έχεις μέχρι να παραδώσεις?

είτε με ένα κείμενπ, είτε από κοντά, είτε Skype, είτε οπωσδήποτε και του δίνω και χρήματα

εγω δεν μπορώ ... αλλά έστειλα email σε κάτι φίλους που ίσως έχουν τη ώρα ...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το συγκεκριμένο το κατάλαβα... Γενικά τι κάνει το perm_vector δεν έχω ιδέα....

Το matrix είναι της μορφής δίνεις στην αρχή πόσες εξισώσεις θα έχεις, και μετά Ν+1 γραμμές με Ν στοιχεία

 

Δηλαδή αν έχουμε

 

 

5x1 + 3x2 + 3x3 + 4x4 + 8x5 = 12

3x1 + 2x2 + 7x3 + 9x4 + 2x5 = 7

8x1 + 7x2 + 4x3 + 2x4 + 8x5 = 18

2x1 + 5x2 + 2x3 + 3x4 + 3x5 = 24

9x1 + 2x2 + 2x3 + 4x4 + 7x5 = 57

 

 

Θα έχουμε

5

5 3 8 2 9

3 2 7 5 2

3 7 4 2 2

4 9 2 3 4

8 2 8 3 7

12 7 18 24 57

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το συγκεκριμένο το κατάλαβα... Γενικά τι κάνει το perm_vector δεν έχω ιδέα....

Το matrix είναι της μορφής δίνεις στην αρχή πόσες εξισώσεις θα έχεις, και μετά Ν+1 γραμμές με Ν στοιχεία

 

Δηλαδή αν έχουμε

 

 

5x1 + 3x2 + 3x3 + 4x4 + 8x5 = 12

3x1 + 2x2 + 7x3 + 9x4 + 2x5 = 7

8x1 + 7x2 + 4x3 + 2x4 + 8x5 = 18

2x1 + 5x2 + 2x3 + 3x4 + 3x5 = 24

9x1 + 2x2 + 2x3 + 4x4 + 7x5 = 57

 

 

Θα έχουμε

5

5 3 8 2 9

3 2 7 5 2

3 7 4 2 2

4 9 2 3 4

8 2 8 3 7

12 7 18 24 57

 

OK, ωραίος τρόπος να γράψεις ένα matrix.

για το perm_vector καταλαβαίνεις τι κάνει η malloc?

--απλως ρεζερβαρει τα Bytes που θα χρειαστεί στην μνήμη

 

είναι όντως δύσκολο πρόγραμμα, αλλα τι παραπάνω χρειάζονται για την εργασία απο τα σχόλια που ήδη έχει?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Λογικά να καταλάβει τι πραγματικά κάνει... Π.χ. αν το ρωτήσει τι κάνει το perm_vector να μπορεί να απαντήσει. Όντως περίεργος κώδικας και δεν έχω ασχοληθεί με MPI να σε βοηθήσω.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ναι αυτό ακριβώς.. Γενικά τι κάνει το πρόγραμμα. Πχ θα ρωτήσει ποια η χρησιμότητα του row elements..

Ζήτησα και πήρα παράταση εώς Τετάρτη.. Αν βρεθεί κανένα καλό παιδί αύριο, θα ήμουν ΥΠΕΡΧΑΡΟΥΜΕΝΟΣ

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το perm_vector αρχικά είναι {0,1,2,3,..order-1} (δ.λ.δ. perm_vector[2]=2;)

και κρατάει την αρίθμηση των rows του my_a[][] . Η διάταξη των στοιχείων του αλλάζει κάθε φορά σύμφωνα με το pivot_row.

Γιαυτό και βλέπεις συχνά my_a[perm_vector][j] αντί για my_a[j]

Κάθε MPI process επεξεργάζεται ένα (η παραπάνω αν δε φτάνουν για όλα) row.

Η απλή μέθοδος Gauss είναι όπου κάθε γραμμή του πίνακα επεξεργάζεται (πολλαπλασιάζονται με κάποιον συντελεστή τα στοιχεία) από διαφορετικό process.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Εγώ νομίζω δεν ξέρω αν κάνω λάθος ότι το perm_vector, που δεν είναι προσωρινό, αλλά μεταθετικό έχεις το mya και το myb ξάχνουν και τα 2 μέσα στον πίνακα και αν κάνεις αντιμετάθεση mya με myb, το perm_vector δείχνει εκεί που έγινε η αντιμετάθεση για να συνεχιστεί το ψάξιμο. Αυτό νομίζω με μία γρήγορη ματιά που το είδα, αλλά δεν έχω ιδέα αν είναι σωστό

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...