0

こんにちは、私は次のように動作する MPI クイックソート プログラムを作成しました。

私のクラスターでは、「マスター」は整数データを分割し、これらを「スレーブ ノード」に送信します。スレーブ ノードで受信すると、各スレーブは個別の並べ替え操作を実行し、並べ替えられたデータをマスターに送り返します。今私の問題は、スレーブにハイパースレッディングを導入することに興味があることです。

マスターからのデータがあります

  1. sub (配列を表す)
  2. count (配列のサイズ)

ここで、Pthreads を次のように初期化しました。

 num_threads=12.
    pthread_attr_init(&attr);
   pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
  for (i = 0; i < num_pthreads; i++) {
    if (pthread_create(&thread[i], &attr, new_thread, (void *) &sub[i])) 
    {
       printf("error creating a new thread \n");
       exit(1);
    }
    else
    {
        printf(" threading is successful %d  at node %d \n \t ",i,rank);
    }       

そして新しいスレッド関数で

void * new_thread(int *sub)
{

    quick_sort(sub,0, count-1);
    }
    return(0);
}

自分のやり方が正しいかどうかわかりません。誰でもこの問題を解決できますか?

4

2 に答える 2

0

スレッドから結果を取得する方法も決定する必要があることを除いて、基本的な考え方は正しいです。

通常、スレッドがそのタスクを完了するために関連するすべての情報を*arg引数 fromに渡す必要がありますpthread_createnew_thread()関数では、変数は関数にcount渡されないため、すべてのスレッド間でグローバルです。より良いアプローチは、 from を介して構造体へのポインターを渡すことpthread_createです。

typedef struct {
    int *sub; /* Pointer to first element in array to sort, different for each thread. */
    int count; /* Number of elements in sub. */
    int done; /* Flag to indicate that sort is complete. */
} thread_params_t


void * new_thread(thread_params_t *params)
{
   quick_sort(params->sub, 0, params->count-1); 
   params->done = 1;
   return 0;
}

thread_params_t生成されたスレッドごとに新しいものを入力します。

管理する必要があるもう 1 つの項目は、並べ替えの結果です。メインスレッドがpthread_join各スレッドで a を実行して、続行する前に完了したことを確認するのは正常です。要件に応じて、各スレッドに結果をマスターに直接送信させるか、メイン関数で各スレッドから結果を収集し、ワーカー スレッドの外部に結果を送信させることができます。

于 2012-09-10T13:25:27.003 に答える
0

代わりに OpenMP を使用できますpthreads(念のため、MPI とスレッドを組み合わせることをハイブリッド プログラミングと呼びます)。これは、順次コードを並列コードに変換するコンパイラ プラグマの軽量セットです。OpenMP のサポートは、事実上すべての最新のコンパイラで利用できます。OpenMP では、いわゆる並列領域が導入されます。並列領域の開始時にスレッドのチームが作成され、コードは並列領域の終了まで並行して実行され続けます。ここで、すべてのスレッドが結合され、メイン スレッドのみが実行を継続します (スレッドの作成と結合は論理的です。たとえば、実際にはこのように実装する必要はなく、ほとんどの実装では実際にスレッドプールを使用してスレッドの作成を高速化しています):

#pragma omp parallel
{
   // This code gets executed in parallel
   ...
}

omp_get_thread_num()並列ブロック内で使用して、スレッドの ID を取得し、別のものを計算させることができます。forまたは、 、 などの OpenMP のワークシェアリング構造の 1 つを使用sectionsして、作業を自動的に分割することができます。

OpenMP の最大の利点は、ソース コードに大きな変更を加えず、スレッドの作成/結合を抽象化するため、手動で行う必要がないことです。ほとんどの場合、ほんの数個のプラグマで問題を解決できます。次に、コンパイル中に OpenMP を有効にする必要があります ( -fopenmpGCC-openmp用、Intel コンパイラ-xopenmp用、Sun/Oracle コンパイラ用など)。OpenMP を有効にしない場合、または特定のコンパイラが OpenMP をサポートしていない場合は、シリアル プログラムが生成されます。

LLNLで、簡単で包括的な OpenMP チュートリアルを見つけることができます。

于 2012-09-10T13:57:47.470 に答える