BackInBlack123 Δημοσ. 13 Μαΐου 2018 Δημοσ. 13 Μαΐου 2018 (επεξεργασμένο) Καλησπέρα εχω το παρακάτω ερωτημα σε Linux στην C και εχω κολλησει.. Μπορει κανεις να με βοηθησει θα το εκτιμουσα παρα πολυ. Γράψτε ένα πρόγραμμα σε C το οποίο να υπολογίζει «παράλληλα» το εσωτερικό γινόμενο δύο διανυσμάτων Α και Β (a1b1+a2b2+……+anbn) [με τη βοήθεια ‘p’ threads όπου το κάθε thread θα υπολογίζει το επιμέρους άθροισμα ‘n/p’ όρων (επιμέρους γινομένων) – τα p, n, ai και bi θα πρέπει να τα δίνει ο χρήστης ή να τα διαβάζετε από αρχείο – επίσης θεωρείστε ότι το ‘n’ είναι ακέραιο πολλαπλάσιο του ‘p’]. Πιο συγκεκριμένα, το κάθε thread θα πρέπει (α) να υπολογίζει τοπικά (σε μια τοπική μεταβλητή – π.χ. local_sum) τo επιμέρους άθροισμα που του αναλογεί και (β) να ενημερώνει στο τέλος με το τοπικό του άθροισμα μια κοινή μεταβλητή (π.χ. total_sum) η οποία θα αντιπροσωπεύει το τελικό άθροισμα (εσωτερικό γινόμενο). Το τελικό αυτό άθροισμα θα πρέπει στο τέλος να τυπώνεται στην οθόνη. Υπάρχει κάπου κρίσιμο τμήμα/κώδικας που απαιτεί προστασία (αμοιβαίο αποκλεισμό) ? Αν ναι, γράψτε επιπλέον τον κώδικα για να προστατευθεί το κρίσιμο αυτό τμήμα (Ι) με χρήση του μηχανισμού ‘κλειδώματος’ που παρέχουν τα POSIX Threads και (ΙΙ) με χρήση POSIX semaphores. *επισης ο κωδικας ειναι ημιτελης Επεξ/σία 13 Μαΐου 2018 από BackInBlack123
kaliakman Δημοσ. 13 Μαΐου 2018 Δημοσ. 13 Μαΐου 2018 5 λεπτά πριν, BackInBlack123 είπε Καλησπέρα εχω το παρακάτω ερωτημα στην C++ και εχω κολλησει.. Μπορεις κανεις να με βοηθησει θα το εκτιμουσα παρα πολυ. Γράψτε ένα πρόγραμμα σε C το οποίο να υπολογίζει «παράλληλα» το εσωτερικό γινόμενο δύο διανυσμάτων Α και Β (a1b1+a2b2+……+anbn) [με τη βοήθεια ‘p’ threads όπου το κάθε thread θα υπολογίζει το επιμέρους άθροισμα ‘n/p’ όρων (επιμέρους γινομένων) – τα p, n, ai και bi θα πρέπει να τα δίνει ο χρήστης ή να τα διαβάζετε από αρχείο – επίσης θεωρείστε ότι το ‘n’ είναι ακέραιο πολλαπλάσιο του ‘p’]. Πιο συγκεκριμένα, το κάθε thread θα πρέπει (α) να υπολογίζει τοπικά (σε μια τοπική μεταβλητή – π.χ. local_sum) τo επιμέρους άθροισμα που του αναλογεί και (β) να ενημερώνει στο τέλος με το τοπικό του άθροισμα μια κοινή μεταβλητή (π.χ. total_sum) η οποία θα αντιπροσωπεύει το τελικό άθροισμα (εσωτερικό γινόμενο). Το τελικό αυτό άθροισμα θα πρέπει στο τέλος να τυπώνεται στην οθόνη. Υπάρχει κάπου κρίσιμο τμήμα/κώδικας που απαιτεί προστασία (αμοιβαίο αποκλεισμό) ? Αν ναι, γράψτε επιπλέον τον κώδικα για να προστατευθεί το κρίσιμο αυτό τμήμα (Ι) με χρήση του μηχανισμού ‘κλειδώματος’ που παρέχουν τα POSIX Threads και (ΙΙ) με χρήση POSIX semaphores. Καλησπέρα, τι πρόβλημα αντιμετωπίζεις; 1
BackInBlack123 Δημοσ. 13 Μαΐου 2018 Μέλος Δημοσ. 13 Μαΐου 2018 (επεξεργασμένο) 32 λεπτά πριν, kaliakman είπε Καλησπέρα, τι πρόβλημα αντιμετωπίζεις; Crasharei το προγραμμα καθε φορα που παω να το τρεξω.. #include <stdio.h> #include <stdlib.h> #include <pthread.h> int p; void *add(int *a, int *b, int *c,int n, void *arg) {int i,j,start,end,lines; int id=(int)arg; lines=n/p; start=id *lines; end=start + lines; for(i=start; i<end; i++){ c[i]=b[i]*c[i]; }return NULL; } int main(int argc, char * argv[]) { int i,n; pthread_t *tid; if(argc<2){ printf("Provide number of threads\n"); exit(1); } else if(argc<3){ printf("Provide n\n"); exit(2); } p=atoi(argv[1]); n=atoi(argv[2]); int *A=(int *)malloc(n*sizeof(int)); int *B=(int *)malloc(n*sizeof(int)); int *C=(int *)malloc(n*sizeof(int)); tid=(pthread_t *)malloc(p*sizeof(pthread_t)); if(tid==NULL || A==NULL || B==NULL || C==NULL) {printf("Could not allocate memory\n"); exit(1); } for(i=0;i<p;i++){ pthread_create(&tid[i],NULL,add(A,B,C,n,(void *) i),(void *)i); } for(i=0;i<p;i++) { pthread_join(tid[i],NULL); } for(i=0;i<n;i++) {printf("%d\n", C[i]);} return 0; } Επεξ/σία 13 Μαΐου 2018 από BackInBlack123
kaliakman Δημοσ. 13 Μαΐου 2018 Δημοσ. 13 Μαΐου 2018 Φαντάζομαι όταν κρασάρει σου δείχνει κάποιο μήνυμα λάθους,σωστά; Επίσης τι σημαίνει κρίσιμος κώδικας κτλ γνωρίζεις; 1
Fortistis Δημοσ. 13 Μαΐου 2018 Δημοσ. 13 Μαΐου 2018 16 λεπτά πριν, BackInBlack123 είπε Crasharei η C++ καθε φορα που παω να το τρεξω.. #include <stdio.h> #include <stdlib.h> #include <pthread.h> int p; void *add(int *a, int *b, int *c,int n, void *arg) {int i,j,start,end,lines; int id=(int)arg; lines=n/p; start=id *lines; end=start + lines; for(i=start; i<end; i++){ c[i]=b[i]*c[i]; }return NULL; } int main(int argc, char * argv[]) { int i,n; pthread_t *tid; if(argc<2){ printf("Provide number of threads\n"); exit(1); } else if(argc<3){ printf("Provide n\n"); exit(2); } p=atoi(argv[1]); n=atoi(argv[2]); int *A=(int *)malloc(n*sizeof(int)); int *B=(int *)malloc(n*sizeof(int)); int *C=(int *)malloc(n*sizeof(int)); tid=(pthread_t *)malloc(p*sizeof(pthread_t)); if(tid==NULL || A==NULL || B==NULL || C==NULL) {printf("Could not allocate memory\n"); exit(1); } for(i=0;i<p;i++){ pthread_create(&tid[i],NULL,add(A,B,C,n,(void *) i),(void *)i); } for(i=0;i<p;i++) { pthread_join(tid[i],NULL); } for(i=0;i<n;i++) {printf("%d\n", C[i]);} return 0; } Δεν είναι C++ ο κώδικας που έχεις γράψει ούτε και η C++ είναι κάτι που μπορεί να "crashάρει". Επίσης, στην main περνάς (γιατί αλήθεια; ) έναν void pointer και στην function περιμένεις int ως προτελευταίο arg. Συν ό,τι είπε και ο από πάνω. 1
BackInBlack123 Δημοσ. 13 Μαΐου 2018 Μέλος Δημοσ. 13 Μαΐου 2018 (επεξεργασμένο) 30 λεπτά πριν, kaliakman είπε Φαντάζομαι όταν κρασάρει σου δείχνει κάποιο μήνυμα λάθους,σωστά; Επίσης τι σημαίνει κρίσιμος κώδικας κτλ γνωρίζεις; Βγάζει error segmented pagination (core dumped) 26 λεπτά πριν, Fortistis είπε Δεν είναι C++ ο κώδικας που έχεις γράψει ούτε και η C++ είναι κάτι που μπορεί να "crashάρει". Επίσης, στην main περνάς (γιατί αλήθεια; ) έναν void pointer και στην function περιμένεις int ως προτελευταίο arg. Συν ό,τι είπε και ο από πάνω. Εκανα εγω λαθος ειναι σε C και ειναι σε Linux επισης στην main περναω argc argv στην add εχω void εχω των κωδικα για 2Δ πινακα ειναι κοπι πειστ αυτος απλα προσπαθω να τον αλλαξω για 1Δ Επεξ/σία 13 Μαΐου 2018 από BackInBlack123
Fortistis Δημοσ. 13 Μαΐου 2018 Δημοσ. 13 Μαΐου 2018 4 ώρες πριν, BackInBlack123 είπε εχω των κωδικα για 2Δ πινακα ειναι κοπι πειστ αυτος απλα προσπαθω να τον αλλαξω για 1Δ OK. Μπορείς να παραθέσεις τι έχεις κάνει **όντως** εσύ; 1 1
BackInBlack123 Δημοσ. 14 Μαΐου 2018 Μέλος Δημοσ. 14 Μαΐου 2018 10 ώρες πριν, Fortistis είπε OK. Μπορείς να παραθέσεις τι έχεις κάνει **όντως** εσύ; Εγώ απλά άλλαξα τους πίνακες σε μονοδιάστατους και έκανα malloc γιατί το μέγεθος θα δίνεται από τον χρήστη. Στο "original" πρόγραμμα το μέγεθος δινόταν με fixed μεταβλητή με δήλωση #define
Fortistis Δημοσ. 14 Μαΐου 2018 Δημοσ. 14 Μαΐου 2018 Ωραία. Τότε: 1) Φρόντισε να λειτουργεί ο κώδικάς σου για την απλή περίπτωση χωρίς πολλαπλές διεργασίες. 2) Αφού σιγουρέψεις ότι λειτουργεί ο κώδικας, τότε καλείς την function μέσα από διαφορετικές διεργασίες. 1
BackInBlack123 Δημοσ. 14 Μαΐου 2018 Μέλος Δημοσ. 14 Μαΐου 2018 1 ώρα πριν, Fortistis είπε Ωραία. Τότε: 1) Φρόντισε να λειτουργεί ο κώδικάς σου για την απλή περίπτωση χωρίς πολλαπλές διεργασίες. 2) Αφού σιγουρέψεις ότι λειτουργεί ο κώδικας, τότε καλείς την function μέσα από διαφορετικές διεργασίες. Ευχαριστώ πολυ ολα εντάξει, νομίζω πως το εχω. 1
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα