2

OpenMP で並列化しようとしている関数が 1 つあります。すべての反復が他の反復から独立している大きなforループがあり、次のようなものを使用したい

#pragma omp for private(j)

ループを並列化します。

1 つの問題は、ループの反復ごとにかなりの量の一時ワークスペースが必要になることです。この一時ワークスペースを反復ごとに 1 回割り当てて解放すると、パフォーマンスが低下する可能性が高いと思います。私の環境には「ワークスペース」オブジェクトがあり、古いワークスペース オブジェクトをそのまま再利用しても問題はありません。

スレッドが作成される前に各スレッドにワークスペースを割り当てるにはどうすればよいですか (スレッドがいくつあるかわかりません)。プールから一意のワークスペース オブジェクトを選択するように各スレッドに指示するにはどうすればよいですか?

4

3 に答える 3

3

すべてのスレッドに十分なワークスペースを使用omp_get_max_threads()して割り当てることができます (たとえば、omp_get_max_threads()要素を含むワークスペースの配列)。次に、各スレッドで使用omp_get_thread_num()して、実行中のスレッドを認識し、独自のワークスペースを取得できるようにします。

于 2013-01-07T00:43:12.953 に答える
2

多分私は要点を逃していますが、次の戦略はうまくいきませんか?

void foo() {

  #pragma omp parallel
  {
    // allocate work-space here, so to make it private to the thread
    thread_workspace t;

    #pragma omp for
    for(int j = 0; j < N; j++) {
      // Each thread has its local work-space allocated outside the for loop
    }
  } // End of the parallel region

}
于 2013-01-07T20:44:06.013 に答える
1

オブジェクト プール デザイン パターンを使用することをお勧めします。 ここに説明があります。ワークスペースの取得メソッドと解放メソッドをスレッド セーフにする必要があることは明らかです (ReusablePool の 3 つのメソッドには同期が必要です)。ワークスペースの数は、一度に必要な総数まで増加します。回収されたワークスペースは、ReusablePool によって再利用されます。

オブジェクト プールはオブジェクトのインスタンス化を処理しますが、その主な目的は、クライアントがオブジェクトを新しいオブジェクトのように再利用する方法を提供することです。

于 2013-01-07T01:05:40.797 に答える