スレッド ID に基づいて、各スレッドが独自の変数セットを持つ、並列のスケジュールされた (例: 静的/動的/ガイド付き) for ループを実行したいと考えています。parallel プラグマ内で宣言された変数はプライベートであることはわかっていますが、for ループの反復ごとに変数を再宣言したくありません。
私の特定の状況では、一連の生成座標が円の内側または外側にあるときはいつでもカウントして、円周率を近似しています。各スレッドでこれらの座標を生成するために erand48(int[3] seed) を使用しています。各スレッドに「シード」の異なる値のセットを与えることで、近似に使用する数値の種類を増やすことができます。 (また、このシミュレーションの要件でもあります)。
long long int global_result = 0;
int tID = omp_get_thread_num();
int[3] seed;
seed[0] = (((tid*tid + 15) * 3)/7);
seed[1] = ((((tid + tid) * 44)/3) + 2);
seed[2] = tid;
int this_result = 0;
# pragma omp parallel for num_threads(thread_count) schedule(runtime)
for(i = 0; i < chunksize; i++){
x = erand48(seed);
y = erand48(seed);
((x*x+y*y)>=1)?(this_result++):;
}
# pragma omp critical{
global_result+= this_result;
}
これは、私がやろうとしていることを表現できる最高のものです。「this_result」、「tid」、「seed」の値にプライベート スコープを持たせたい。