0

私はここで新しいです、そして、私は一般的にプログラミングで比較的新しいです。私はCでプログラムを書いたので、pthreadを使ってそれを加速する必要があります。私はOpenMPを使ってそうしようとしましたが、デバッグ方法はわかりません。また、プログラムがpthreadsと時間を使ってより高速であるかどうかを調べる必要がありますが、私のコードでこれを書く方法はわかりません。ここに私のコードに私めちゃめちゃメールのpthreadsを使ってCプログラムを高速化する

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*/ 
} 

申し訳ありませんが、私は彼女が今、私は

答えて

5

追加のスレッドがあなたのプログラムを加速しないことがあり、それを使用するために取得しています新たなんだ、それはあなたが整理行うことができますあなたの並行して実行されるように見える実行ユニット(およびマルチコアシステムでは、一般に並行して実行することができる)に作業します。マルチコアシステムを使用していない場合でも、他のスレッドが引き続き実行できるので、1つ以上のスレッドが遅い入力待ちをブロックしなければならない場合でも、利点が得られます。これは、実際のプログラムに応じて、より速いランタイムを提供する場合と提供しない場合があります。

スレッドのデバッグは、一般に単一のスレッドのデバッグよりも難しく、実行方法は使用可能なツールになります。デバッガで作業を簡単にすることができない場合は、最初にプログラムをシリアルで実行することをお勧めします。スレッドモデルを使用してブレークしますが、それぞれのコードをプライマリスレッドで実行して実行させますあなたのモデルがこれを許可するならば、完了まで。スレッドは実行時に依存しているため、多くのスレッドアプリケーションはそのように記述することはできませんが、正確に何をしているのかによって異なります。

あなたの特定の状況に - あなたはまだ泳ぐ方法がわからないときに深いところまで潜入しています。私はあなたが最初に必要とする理由の複雑さなしにスレッドを使用することを学ぶことをお勧めします。そうしないと、必要以上に複雑になってしまいます。 http://cs.gmu.edu/~white/CS571/Examples/Pthread/create.cには簡単な例があります。 pthread_create()コールのパラメータに特に注意し、実行したことと比較してください。あなたのコードにはスレッドとして実行する3番目のパラメータがありません。そのような関数はまったくないように見えますが、代わりにpthread_create()の呼び出しに続くコードが並行して実行されるコードであると思われるようです。これはどのようにfork()の動作ですが、それは非常に異なります。

これで十分です。 http://cs.gmu.edu/~white/CS571/Examples/pthread_examples.htmlには例があり、 "pthread tutorial"のgoogleが参考になるでしょう。

+2

スレッドを追加する_may_あなたのプログラムを高速化しないでください。 –

+0

@Pavan Manjunath - true。私は自分の投稿を更新しました。 – mah

+0

あなたの答えをありがとう、私はこのプログラムでpthreadsを使用しなければならないことです、私はそれをよりよく理解しようとします、そして、私はさらなる質問で戻るでしょう – Vasouli