2017-08-04 33 views
0

私は並列プログラミングに慣れていないので、起動できるスレッドの最大数を知りたいと思っていました。openMpの最大スレッド

私はこの

#include<stdio.h> 
#include<omp.h> 
void pooh(int id,int a[]) 
{ 
    a[id]=a[id]-1 ; 
    printf("%d\n",id) ; 
} 
int main() 
{ 
    int a[1001] ; 
    int i ; 
    for(i=0;i<1000;i++) 
    { 
     a[i]=i+1 ; 
    } 
    omp_set_num_threads(1000) ; 
    #pragma omp parallel 
    { 
     int id=omp_get_thread_num() ; 
     pooh(id,a) ; 
    } 

    return 0 ; 
} 

を試みたが、私はOMP_SET_NUM_THREADS(10000)をしようとしたとき、 プログラムが実行されません。私はジョブを完了させるために起動できるスレッドの最大数を知りたかったのです。

+0

アプローチが非常に分かりやすいかどうかわかりませんが、バイナリ検索を試すことができます - 動作するまでは500回、次に250回、次に125回試してみてください。次に、数字の下限と上限を知り、その間隔を再び半分に分割し始めます。 –

答えて

1

ここでは、問題文から理解しなければならない2つの側面があります。あなたの質問に直接答えるために、設定されることが推奨される最大スレッドは、コアの数*ハイパースレッドです。それ以外の場合、スレッドはリソースを待つだけです。あなたがintel GPUで使用する予定がない限り、これは通常2、4、8、16 ..そしてほぼ決してありません。

第2の側面は、実装戦略を変更することをお勧めします。なぜあなたはompが自動的にそれを行うことができます(しない限り、大学の割り当てや何かのために)これをしたいだろうが、 #pragma omp parallel for

またはワークロードを自分で分割:を見てみましょう。

+0

openMP環境でIntel GPUを使用できますか? そして、最大コア数が4コアであれば、私が使用すべきスレッドは4です。したがって、4つの部分で問題を分ける必要がありますか? – Hotspur

+0

私はプラグマを – itsnevertoobadtoaskforhelp

1

あなたの質問:作成できるスレッドの最大数は、システムによって異なります。 Linuxでは、cat /proc/sys/kernel/threads-max を使用してこれを見つけることができます(たとえば、Maximum number of threads per process in Linux?を参照)。

あなたが知りたいと思うこと:しかし、これはあなたの望むものではありません。これはあなたのシステムを完全にオーバーロードするためです。経験則として、システムで使用可能なプロセッサの数を超える必要はありません。これはLinuxでnprocを使用して確認できます(例:How to obtain the number of CPUs/cores in Linux from the command line?を参照)。

ご使用のシステムで使用できるプロセッサー数を超える数を使用すると、アプリケーションの実行速度が遅くなります

関連する問題