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

Βοηθεια σε προγραμμα με χρηση pthreads


MauriDalia

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

Δημοσ.

Γεια σας,

Εχω υλοποιησει την ακολουθιακη εκδοχη του αλγοριθμου jacobi και αντιμετωπιζω προβλημα στην παραλληλη εκδοχη οπου χωριζω τον 400χ400 πινακα μου σε ισομερη τμηματα (καθε τμημα 2 γραμμες) οποτε εχω τοσα νηματα οσα και τα ισομερη τμηματα.Ενω το compile δεν μου πεταει κανενα λαθος,κατα το run μου πεταει segmentation fault.:shock:

 

Παραθετω καποια σημεια του κωδικα μου

>
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?

 

Ευχαριστω:-)

Δημοσ.

Επαναφερω το θεμα μιας και προσπαθω να καταλαβω γιατι μου πεταει segmentation fault και δεν μπορω :cry:

Το πλεγμα των σημειων προς ανανεωση πρεπει να χωριζεται σε ισομερη τμηματα και εχω εναν πινακα 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::cry::cry::cry::cry:

Επισκέπτης
Δημοσ.

debug με το gdb προσπάθησες να κάνεις?

Δημοσ.
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::confused::confused::confused:

Δημοσ.

Αν καταλαβα καλα....πρεπει να χει λαθος την ωρα που διαβαζει το αρχειο...πιγα να κανς μια αλλαγη αλλα παει να τρεξει και δεν εκτυπωνει τιποτα απολυτως...τα χω κανει...:shock:

Επισκέπτης
Δημοσ.

Στην γραμμή 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 

Δημοσ.

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:-D

Επισκέπτης
Δημοσ.

atoi(arg) είναι η συνάρτηση. int() δεν υπάρχει στην standard βιβλιοθήκη της ANSI C.

 

Συμβουλή: Κάτσε διάβασε C, χωρίς να ξέρεις την γλώσσα καλά δεν μπορείς να γράψεις multithreaded εφαρμογές που να δουλεύουν σωστά.

Επισκέπτης
Δημοσ.

oups.. νόμιζα ότι ήταν char * η παράμετρος

 

θα μπορούσες επίσης να κάνεις την εξής δήλωση:

 

#define int(voidp) (*((int *) voidp))

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

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

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