0

最初の投稿!

メジャー編集。

gccと-fopenmpを使用してコンパイルされた、ドット積を計算するためのこのプログラムがあります。問題は、作成するように指示した数のスレッドが作成されていないことです。あるコンピューターでは常に2つのスレッドを生成し、別のコンピューターでは4つのスレッドを生成します。これらの番号はどちらもそれらに与えられた番号ではありません。私は(静的、チャンクサイズ)スケジューリングを使用しています。これは、チャンクサイズを変更することで、作成するスレッドの数を選択できる間接的な方法です。すべてのコンピューターが同じ実行可能ファイルを使用しているため、ランタイムに私の指示をオーバーライドする何かがあるように感じます。また、プログラムに合計負荷に等しいチャンクサイズを指定すると、1つのスレッドが使用されますが、それでも以前と同じ数のスレッドが生成されることに気付きました。私は何が間違っているのですか?

    #pragma omp parallel shared(vector1, vector2, loadsize, vectorsize, final_sum) private(i, threadsum, threadid)
    {
    threadsum = 0;
    threadid = omp_get_thread_num();

    #pragma omp for schedule(static, loadsize)
        for (i = 0; i < vectorsize; i++){
            threadsum += vector1[i] * vector2[i];}
     printf("thread %d reached up to index %d with a sum of %d\n", threadid, (i-1), threadsum); 
    #pragma omp critical
        final_sum += threadsum;
}
printf("final sum: %d", final_sum);     

ありがとう、

ザック

4

2 に答える 2

1

私の知る限り、chunksizeは、スレッドによって実行される作業の量を表します。スレッドの生成を制御することはありません。コードからわかるように、呼び出すとスレッドが生成されます

#pragma omp parallel

呼び出すときではありません

#pragma omp for schedule(static, loadsize)

静的および動的スケジューリングは、コンパイル時または実行時にスレッドに割り当てられる作業量を決定するために使用されます。したがって、スケジューリングとスレッド数を混同しないでください。

スレッド数を制御する必要がある場合は、

omp_set_num_threads()
于 2012-06-07T04:44:21.763 に答える
0

OpenMPには、動的スレッド数と呼ばれる機能があります。ランタイムは、並列ブロックがで指定されたよりも少ないスレッドで実行できるかどうかを自由に決定できますOMP_NUM_THREADS。一部のランタイムではデフォルトで有効になっていますが、有効になっている場合は、次のいずれかの方法で無効にできます。

  • OMP_DYNAMIC環境変数の値をFALSE;に設定します。
  • 呼び出すomp_set_dynamic(0);
  • num_treads(#threads)句を使用して、特定の並列領域内のスレッド数を明示的に指定します。

omp_set_num_threads()また、環境変数の値によって、OMP_NUM_THREADS使用されるスレッド数の上限が設定されますが、動的スレッドが有効になっている場合、実際の数はそれよりも少なくなる可能性があります。のデフォルト値OMP_NUM_THREADSは実装に依存します。これは、GCCおよびIntelコンパイラの論理CPUの数に等しく2、最新のOracleStudioコンパイラの場合はに等しくなります。

于 2012-06-08T09:11:53.710 に答える