0

私はここでは初心者であり、プログラミング全般についても比較的新しいです。C でプログラムを作成しましたが、pthreads を使用して高速化する必要があります。OpenMP を使用してこれを実行しようとしましたが、デバッグ方法がわかりません。また、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*/
}

メールがめちゃくちゃで申し訳ありませんが、私は新しい彼女になりました。

4

1 に答える 1

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チュートリアル」のグーグルがおそらく役立つでしょう。

于 2012-03-29T11:52:25.430 に答える