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

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

Δημοσ. (επεξεργασμένο)

Καλησπέρα εχω το παρακάτω ερωτημα σε 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.

 

*επισης ο κωδικας ειναι ημιτελης

Screenshot_1.png

Επεξ/σία από BackInBlack123
Δημοσ.
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.

Screenshot_1.png

Καλησπέρα, τι πρόβλημα αντιμετωπίζεις;

  • Like 1
Δημοσ. (επεξεργασμένο)
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;
}

 

Επεξ/σία από BackInBlack123
Δημοσ.

Φαντάζομαι όταν κρασάρει σου δείχνει κάποιο μήνυμα λάθους,σωστά; Επίσης τι σημαίνει κρίσιμος κώδικας κτλ γνωρίζεις;

  • Thanks 1
Δημοσ.
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. 

Συν ό,τι είπε και ο από πάνω. 

  • Thanks 1
Δημοσ. (επεξεργασμένο)
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Δ

Επεξ/σία από BackInBlack123
Δημοσ.
4 ώρες πριν, BackInBlack123 είπε

εχω των κωδικα για 2Δ πινακα

ειναι κοπι πειστ αυτος

απλα προσπαθω να τον αλλαξω για 1Δ

 

 

OK. 

Μπορείς να παραθέσεις τι έχεις κάνει **όντως** εσύ;

  • Like 1
  • Thanks 1
Δημοσ.
10 ώρες πριν, Fortistis είπε

OK. 

Μπορείς να παραθέσεις τι έχεις κάνει **όντως** εσύ;

Εγώ απλά άλλαξα τους πίνακες σε μονοδιάστατους και έκανα malloc γιατί το μέγεθος θα δίνεται από τον χρήστη. Στο "original" πρόγραμμα το μέγεθος δινόταν με fixed μεταβλητή με δήλωση #define

 

Δημοσ.

Ωραία. Τότε:

1) Φρόντισε να λειτουργεί ο κώδικάς σου για την απλή περίπτωση χωρίς πολλαπλές διεργασίες. 

2) Αφού σιγουρέψεις ότι λειτουργεί ο κώδικας, τότε καλείς την function μέσα από διαφορετικές διεργασίες. 

  • Thanks 1
Δημοσ.
1 ώρα πριν, Fortistis είπε

Ωραία. Τότε:

1) Φρόντισε να λειτουργεί ο κώδικάς σου για την απλή περίπτωση χωρίς πολλαπλές διεργασίες. 

2) Αφού σιγουρέψεις ότι λειτουργεί ο κώδικας, τότε καλείς την function μέσα από διαφορετικές διεργασίες. 

Ευχαριστώ πολυ ολα εντάξει, νομίζω πως το εχω. 

  • Like 1

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

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

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

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

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

Σύνδεση

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

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