3

I am new to OpenMP Programming and I have executed several open-mp sample programs on GCC . I wanted to know how will I decide on how many threads to launch (i.e how to decide the parameter of omp_set_num_threads() function) to get the better performance on dual core intel processor .

*This is my sample program*

#include<math.h>

#include<omp.h>
#include<stdio.h>
#include<time.h>
#define CHUNKSIZE 10
#define N 100000
#define num_t 10

void main ()  
{
    int runTime;
    int i, chunk;
    int a[N], b[N], c[N],threads[num_t];
    int thread_one=0,thread_two=0;
    clock_t start,end;
    omp_set_num_threads(num_t); 
    /* Some initializations */
    for (i=0; i < N; i++)
    a[i] = b[i] = i + 2.0;
    chunk = CHUNKSIZE;
        #pragma omp parallel shared(a,b,c,chunk,threads) private(i)
    {

            #pragma omp for schedule(dynamic,chunk)
            for (i=0; i < N; i++)
            {
                c[i] = pow((a[i] * b[i]),10);
                threads[omp_get_thread_num()]++;

            }
    }  /* end of parallel section */
    for(i=-1;i<num_t;i++)
    printf("Thread no %d : %d\n",i,threads[i]);
}
4

3 に答える 3

3

経験則として、まずスレッド数をマシンのコア数に設定してみてください。次に、この数を減らして、改善が見られるかどうかを確認してください。

ちなみに、このようなテストを行うには、 を使用するよりも、環境変数omp_set_num_threadsを設定するOMP_NUM_THREADS方がはるかに便利です。

于 2012-09-01T07:36:28.950 に答える
3

私のアドバイス:気にしないでください。それが計算集約型のアプリ (openmp が主に使用され、ここにあるもの) である場合、ライブラリ自体がすべてをうまく管理します。

于 2012-09-01T10:07:34.247 に答える
0

最適なスレッド数は多くのパラメータに依存するため、一般的な経験則を考案するのは困難です。

フェッチ/計算比率が低い計算集中型のタスクの場合、スレッドの数を CPU コアの数と等しくなるように設定するのが最適です。

大量のメモリを必要とするタスクの場合、スレッド数を増やすと、スレッド数がコア数と等しくなる前にメモリ帯域幅が飽和する可能性があります。ループのベクトル化は、単一スレッドのメモリ帯域幅に大きな影響を与える可能性があります。スレッドが CPU キャッシュ内の大量のデータを共有する場合もあれば、共有しない場合もあり、スレッド数を増やすと使用可能なキャッシュ領域が減少します。また、NUMA システムは通常、SMP システムよりも優れた帯域幅を提供します。

場合によっては、コアよりも多くのスレッドで最高のパフォーマンスを達成できます。これは、各タスク内で多くのブロッキング待機が観察される場合に当てはまります。実行されるメモリアクセスの種類によっては、SMT またはハイパースレッディングがメモリレイテンシを隠蔽できる場合と隠蔽できない場合があります。

コードのパフォーマンスをモデル化し、実行に最適なスレッド数を推測できる場合を除き、いくつかの値を試してみてください。

于 2012-09-01T08:22:24.047 に答える