MauriDalia Δημοσ. 24 Μαΐου 2008 Δημοσ. 24 Μαΐου 2008 Γεια σας, Εχω υλοποιησει την ακολουθιακη εκδοχη του αλγοριθμου jacobi και αντιμετωπιζω προβλημα στην παραλληλη εκδοχη οπου χωριζω τον 400χ400 πινακα μου σε ισομερη τμηματα (καθε τμημα 2 γραμμες) οποτε εχω τοσα νηματα οσα και τα ισομερη τμηματα.Ενω το compile δεν μου πεταει κανενα λαθος,κατα το run μου πεταει segmentation fault. Παραθετω καποια σημεια του κωδικα μου > void *Worker(void *dummyptr) { int myid = pthread_self(); float diff=0.0; int i,j; Barrier(); // printf("Thread %1d has started\n", pthread_self()); for(; //Basikos epanaliptikos broxos pou xrhsimopoiei niter epanalipseis { for(i =1; i < NR-1; i++) { for(j = 1; j <NC-1; j++) { after[i][j]=0.25*(before[i+1][j]+before[i-1][j]+before[i][j+1]+before[i][j-1]); Barrier(); //sugxronismeni prosbasi sta koina dedomena if (fabs(after[i][j]-before[i][j])>diff) diff=fabs(after[i][j]-before[i][j]); } } if(diff<=Epsilon) break; for(i=1;i<NR-1;i++) for(j=1;j<NC-1;j++) before[i][j]=after[i][j]; Barrier(); } //pthread_exit(NULL); } > void Barrier() { int pthread_mutex_lock(pthread_mutex_t *mutex); int pthread_mutex_trylock(pthread_mutex_t *mutex); int pthread_mutex_unlock(pthread_mutex_t *mutex); pthread_mutex_lock(&barrier); numArrived++; while(numArrived < numThreads) { pthread_cond_wait(&go,&barrier); } pthread_mutex_unlock(&barrier); } Η συναρτηση Worker ειναι αυτη που εκτελουν τα νηματα και η συναρτηση Barrier ειναι για να επιτυχουμε τον αμοιβαιο αποκλεισμο. Ακομα > pthread_attr_init(&attr); /* create the threads, then wait for them to finish */ for (i = 0; i < numThreads; i++) { printf ("Creating thread %d\n", i); pthread_create(&threads[i], &attr, Worker, NULL); } for (i= 0; i < numThreads; i++) { pthread_join(threads[i], NULL); pthread_exit( 0 ); } Αυτο το κοματι το εχω για την δημιουργια νηματων Καμια ιδιεα για ποιο λογο εχω segmentation faul? Ευχαριστω
Επισκέπτης Δημοσ. 24 Μαΐου 2008 Δημοσ. 24 Μαΐου 2008 Μπορείς να κάνεις compile με το option -g (πχ. gcc -Wall -W -O2 -g myfile1.c ....) και μετά να τρέξεις το αρχείο με το gdb για να δεις πού πετάει segmentation fault http://www.unknownroad.com/rtfm/gdbtut/gdbsegfault.html http://www.cprogramming.com/debugging/segfaults.html Good Luck
MauriDalia Δημοσ. 26 Μαΐου 2008 Μέλος Δημοσ. 26 Μαΐου 2008 Επαναφερω το θεμα μιας και προσπαθω να καταλαβω γιατι μου πεταει segmentation fault και δεν μπορω Το πλεγμα των σημειων προς ανανεωση πρεπει να χωριζεται σε ισομερη τμηματα και εχω εναν πινακα 400χ400. > /*Jacobi using Pthreads*/ #include <stdio.h> #include <math.h> #include <stdlib.h> #include <unistd.h> #include <sys/time.h> #include <sys/types.h> #define NR 400 #define NC 399 #include <pthread.h> #include <semaphore.h> #include <stdio.h> void *Worker(void *); void Barrier(); float before[NR][NC],after[NR][NC]; float diff=0.0; float Epsilon=0.001000; pthread_mutex_t barrier=PTHREAD_MUTEX_INITIALIZER;; /* statiki arxikopoihsh*/ pthread_cond_t go; /* condition variable for leaving */ int numArrived = 0; /* count of the number who have arrived */ int numThreads=(NR-2)/2; int main(int argc, char *argv[]) { FILE *fp; float item; int i,j; void *arg; int numThreads=(NR-2)/2; pthread_t threads[numThreads]; pthread_attr_t attr; float change; struct timeval Start, Stop, Diaf; //metrhsh xronou printf("hellooooooooo"); fp = fopen("dokimi.txt","r"); for(i = 0; i <NR; i++) for(j = 1; j <=NC; j++) { fscanf(fp, "%f",&i,&j,&item); //printf("%.0f ", item); before[i][j] = item; } fclose(fp); pthread_attr_init(&attr); /* create the threads, then wait for them to finish */ for (i = 0; i < numThreads; i++) { pthread_create(&threads[i], NULL, Worker,(void*)&i); } pthread_attr_destroy(&attr); for (i= 0; i < numThreads; i++) { pthread_join(threads[i], NULL); pthread_exit( 0 ); } gettimeofday(&Stop, NULL); timersub(&Stop , &Start , &Diaf); fprintf(stdout,"SYNOLIKOS XRONOS:\n"); fprintf(stdout,"Time: %6ld sec %6ld microsec\n",Diaf.tv_sec,Diaf.tv_usec); } /* Each Worker computes values in one strip of the grids. The main worker loop does two computations to avoid copying from one grid to the other. */ void *Worker(void *dummyptr) { int myid = pthread_self(); float diff=0.0; int i,j; Barrier(); // printf("Thread %1d has started\n", pthread_self()); for(; //Basikos epanaliptikos broxos pou xrhsimopoiei niter epanalipseis { for(i =1; i < NR-1; i++) { for(j = 1; j <NC-1; j++) { after[i][j]=0.25*(before[i+1][j]+before[i-1][j]+before[i][j+1]+before[i][j-1]); Barrier(); //sugxronismeni prosbasi sta koina dedomena if (fabs(after[i][j]-before[i][j])>diff) diff=fabs(after[i][j]-before[i][j]); } } if(diff<=Epsilon) break; for(i=1;i<NR-1;i++) for(j=1;j<NC-1;j++) before[i][j]=after[i][j]; Barrier(); } //pthread_exit(NULL); } void Barrier() { int pthread_mutex_lock(pthread_mutex_t *mutex); int pthread_mutex_trylock(pthread_mutex_t *mutex); int pthread_mutex_unlock(pthread_mutex_t *mutex); pthread_mutex_lock(&barrier); numArrived++; while(numArrived < numThreads) { pthread_cond_wait(&go,&barrier); } pthread_mutex_unlock(&barrier); } Επειδη δυστηχω ειμαι λιγο αρχαρια στον προγραμματισμο με νηματα και εχω προσπαθησει αλλα δεν καταλαβαινω τι φταει..αν καποιο εμεπιρο ματι εντοπισει καποιο λαθος ασ το επισημανει!:cry::cry::cry::cry:
MauriDalia Δημοσ. 26 Μαΐου 2008 Μέλος Δημοσ. 26 Μαΐου 2008 debug με το gdb προσπάθησες να κάνεις? Ναι και μου εμφανιζει το εξης (gdb) run Starting program: /home/parallel/paral18/a.out [Thread debugging using libthread_db enabled] [New Thread 46912496199840 (LWP 27359)] Program received signal SIGSEGV, Segmentation fault. [switching to Thread 46912496199840 (LWP 27359)] 0x0000000000400ac7 in main (argc=1, argv=0x7fffc2532e58) at lala.c:51 warning: Source file is more recent than executable. 51 before[j] = item; :confused::confused::confused:
MauriDalia Δημοσ. 26 Μαΐου 2008 Μέλος Δημοσ. 26 Μαΐου 2008 Αν καταλαβα καλα....πρεπει να χει λαθος την ωρα που διαβαζει το αρχειο...πιγα να κανς μια αλλαγη αλλα παει να τρεξει και δεν εκτυπωνει τιποτα απολυτως...τα χω κανει...
nick_csd Δημοσ. 26 Μαΐου 2008 Δημοσ. 26 Μαΐου 2008 για δοκιμασε πριν κλεισεις το αρχειο με fclose να κανεις fflush καμια φορα το κανει
Επισκέπτης Δημοσ. 26 Μαΐου 2008 Δημοσ. 26 Μαΐου 2008 Στην γραμμή 49 αυτό που γράφεις είναι λάθος. > fscanf(fp, "%f",&i,&j,&item); εδώ ζητάς ένα float και περνάς τις διευθύνσεις από 2 int μεταβλητές και μία float. Υποθέτω ότι ήθελες να γράψεις: > fscanf(fp, "%f", &item); PS. Με ποια εντολή κάνεις compile το αρχείο? Δοκίμασε να κάνεις compile ως εξής: > gcc -Wall -W -O2 -g -lpthread lala.c -o jacobi_threads
MauriDalia Δημοσ. 26 Μαΐου 2008 Μέλος Δημοσ. 26 Μαΐου 2008 Eχουμε γραψει την παρακατω συναρτηση Worker σε προγραμμα με χρηση νηματων.Κανς compile με την εντολη gcc -lpthread onoma_arxeiou.c.Το αποτελεσμα του compile ειναι το error :expected expression before int. >void *Worker(void *arg) { int myid; [b] //edw einai to lathos!!!![/b] myid =int(arg); float diff=0.0; int stripSize; int i,j; int first, last; printf("worker %d (pthread id %d) has started\n", myid, pthread_self()); Μπορει καποιος να με βοηθησει????Δεν βλεπω κανα λαθος,ξανα εκανα αλλαγες στον κωδικα μου αλλα δυστυχως δεν ανταποκρινεται σε αυτα που του λεω να κανει!!!:-D:-D:-D
Επισκέπτης Δημοσ. 26 Μαΐου 2008 Δημοσ. 26 Μαΐου 2008 atoi(arg) είναι η συνάρτηση. int() δεν υπάρχει στην standard βιβλιοθήκη της ANSI C. Συμβουλή: Κάτσε διάβασε C, χωρίς να ξέρεις την γλώσσα καλά δεν μπορείς να γράψεις multithreaded εφαρμογές που να δουλεύουν σωστά.
MauriDalia Δημοσ. 27 Μαΐου 2008 Μέλος Δημοσ. 27 Μαΐου 2008 ΟΚ το ελυσα το θεμα ευχαριστω ολους για την βοηθεια σας!!!!
Επισκέπτης Δημοσ. 28 Μαΐου 2008 Δημοσ. 28 Μαΐου 2008 oups.. νόμιζα ότι ήταν char * η παράμετρος θα μπορούσες επίσης να κάνεις την εξής δήλωση: #define int(voidp) (*((int *) voidp))
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.