0

Ich bin neu hier, und ich bin auch relativ neu in der Programmierung im Allgemeinen. Ich habe ein Programm in C geschrieben und muss es mit Pthreads beschleunigen. Ich habe versucht, dies mit OpenMP zu tun, aber ich weiß nicht, wie man es debuggt. Außerdem muss ich herausfinden, ob das Programm schneller mit Pthreads und Zeiten ist, aber ich weiß nicht, wie ich das in meinen Code schreiben soll. Hier ist mein CodeBeschleunigen Sie ein C-Programm mit Pthreads

enter code here 
#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <pthread.h> 
#define NTHREADS 2 
#define FYLLO(komvos) ((komvos) * 2 + 1) 

long factorial(long); 
void heap_function (int [], int, int); 
void make_heap(long [], int); 
void pop_heap(long [], int); 

struct thread_data 
{ 
long int n; 
long int k; 
long *b; 
}; 

main() 
{ 

    long int n,k,c,fact=1; 
    long *a,*b,*d,p[k]; 
    int i,j,rc; 
    int q[]={2,3,4,5,6,7,8,9,12,13,14,15,16}; 
    pthread_t thread[NTHREADS]; 
    struct thread_data threada; 
    for(i=0;i<NTHREADS;i++) 
    { 
    threada.n=n; 
    threada.k=k; 
    threada.b=b; 
    pthread_create (&thread[i], NULL, (void *)&threada); 
    } 
    for (i=0; i<NTHREADS; i++) 
    rc = pthread_join (thread[i], NULL); 

    for(i=0;i<13;i++) 
    { 
    k=pow(2,q[i])-1; 
    if(a=(long*)malloc(i*sizeof(long))==NULL); 
    { 
     printf("Den yparxei diathesimi mnimi gia desmeusi\n"); 
     exit(1); 
    } 
    a[i]=k; 
    for(a[0];a[13];a[i]++) 
    { 
     n=(pow(2,q[i]))*k; 
     if(d=(long*)malloc((i*i)*sizeof(long))==NULL); 
     { 
      printf("Den yparxei diathesimi mnimi gia desmeusi\n"); 
      exit(1); 
     } 
     d[i]=n; 
    } 
    c=(factorial(n))/((factorial(k))*(factorial(n-k)));  
    } 
    if(b=(long*)malloc(((i*i)+i)*sizeof(long))==NULL) 
    { 
     printf("Den yparxei diathesimi mnimi gia desmeusi\n"); 
     exit(1); 
    } 
    for(i=0;i<13;i++) 
    { 
    b[i]=a[i]; 
    } 
    for(i=13;i<182;i++)      /* Gia i=13 exoume i^2=169 kai i^2+i=182*/ 
    { 
    b[i]=d[i]; 
    }  
    long heap[sizeof(b)]; 
    make_heap(heap, sizeof(b)); 
    printf("To heap einai:\n");   
    for (i = sizeof(b); i >=0; i--) 
     { 
      printf("%d ", heap[0]); 
      pop_heap(heap, i); 
     } 
    for(i=(n-k);i<=n;i++) 
     for(j=0;j<k;j++) 
     { 
      p[j]=heap[i]; 
      printf("Ta %d mikrotera stoixeia eina ta %ld\n",k,p[j]); 
     } 
    free((void*)b);    
    getch(); 
} 



long factorial(long n) 
{ 
    int a; 
    long result=1; 

    for(a=1;a<=n;a++) 
    result=result*a; 

    return(result); 
} 



void heap_function(int a[], int i, int n) 
{ 

    while (FYLLO(i) < n)     /* Vazoume sto heap ta stoixeia san   ypodentra */ 
{ 

    int fyllo = FYLLO(i); 


    if (fyllo + 1 < n && a[fyllo] < a[fyllo + 1])  /* Dialegoume to maegalytero apo ta dyo paidia komvous */ 
    ++fyllo; 


    if (a[i] < a[fyllo])      /* Metaferoume to megalytero komvo sti riza */ 
    { 
    int k = a[i]; 
    a[i] = a[fyllo]; 
    a[fyllo] = k; 
    } 


    ++i;         /* Synexizoume ston epomeno komvo */ 
    } 
} 


void make_heap(long a[], int n)  /*Dhmioyrgoume ti sinartisi make_heap gia na mporesoume na valoume ta 
             stoixeia pou dwsame mesa sto heap kai na ta ta3inomisoume*/ 
{ 
    int i = n/2; 

    while (i-- > 0) 
    heap_function(a, i, n); 
} 


void pop_heap(long heap[], int n)  /*Dhmiourgoume ti sinartisi pop_heap gia na mporesoume na e3agoume 
             ta stoixeia apo to heap apo to megalytero sto mikrotero*/ 
{ 
    long k = heap[0]; 
    heap[0] = heap[n]; 
    heap[n] = k; 
    heap_function(heap, 0, n);   /*Afou emfanistei to prwto stoixeio kaloume ti sinartisi heap_function 
             gia na ta3inomisei ta stoixeia pou menoun sto heap*/ 
} 

Sorry für meine verkorkste Mail, aber ich bin neu ihr jetzt bin ich immer, es zu benutzen

Antwort

5

Hinzufügen von Themen Ihr Programm nicht beschleunigen kann, es können Sie organisieren Ihre arbeiten in Ausführungseinheiten, die scheinbar parallel laufen (und auf Multicore-Systemen können sie im Allgemeinen parallel laufen). Wenn Sie nicht auf einem Multi-Core-System arbeiten, können Sie immer noch einen Vorteil erzielen, wenn einer oder mehrere Ihrer Threads blockieren müssen, um auf langsame Eingaben zu warten, da andere Threads weiterhin ausgeführt werden können. Je nach aktuellem Programm erhalten Sie dadurch möglicherweise eine schnellere Laufzeit.

Das Debuggen von Threads ist im Allgemeinen schwieriger als das Debuggen eines einzelnen Threads, und wie Sie es tun, kommt auf die Tools an, die Sie zur Verfügung haben. Wenn Ihr Debugger die Arbeit für Sie nicht einfacher machen kann, würde ich Ihnen empfehlen, das Programm zunächst seriell auszuführen. Teilen Sie es immer noch mit einem Threading-Modell auf, lassen Sie den Code jedoch im primären Thread laufen und lassen Sie ihn laufen bis zur Fertigstellung, wenn Ihr Modell dies zulässt. Viele Threading-Anwendungen können nicht so geschrieben werden, da Threads während der Laufzeit voneinander abhängen, aber es hängt nur davon ab, was genau Sie tun.

Nun zu Ihrer speziellen Situation - Sie tauchen in das tiefe Ende ein, wenn Sie noch nicht schwimmen können. Ich würde vorschlagen, dass Sie zuerst lernen, Threads ohne die Komplexität zu verwenden, warum Sie sie brauchen, andernfalls machen Sie das Problem komplizierter, als es sein muss. http://cs.gmu.edu/~white/CS571/Examples/Pthread/create.c hat ein einfaches Beispiel für den Einstieg. Beachten Sie besonders die Parameter des Aufrufs pthread_create() und vergleichen Sie mit dem, was Sie getan haben; Ihrem Code fehlt der 3. Parameter - die Funktion, die als Thread ausgeführt wird. Sie scheinen überhaupt keine solche Funktion zu haben, und stattdessen scheinen Sie zu glauben, dass der Code, der dem Aufruf von pthread_create() folgt, parallel läuft. So funktioniert fork() funktioniert, aber das ist sehr unterschiedlich.

Das sollte genug sein, um loszulegen. http://cs.gmu.edu/~white/CS571/Examples/pthread_examples.html hat zusätzliche Beispiele, und ein Google "Pthread Tutorial" wäre wahrscheinlich hilfreich.

+2

Hinzufügen von Threads _may_ nicht beschleunigen Ihr Programm könnte ein besserer Begriff sein –

+0

@Pavan Manjunath - true. Ich habe meinen Beitrag aktualisiert. – mah

+0

Vielen Dank für Ihre Antwort, die Sache ist, dass ich PThreads in diesem Programm verwenden muss, ich werde versuchen, es besser zu verstehen und ich werde mit weiteren Fragen zurück sein – Vasouli