ヘルウー、
スレッド化しようとしているかなり大きなプログラムがあります。これまでのところ、これは成功しており、基本はすべて意図したとおりに機能しています。
私は今、ネストされたモードでカスケードスレッドを使っていくつかの凝った仕事をしたいと思っています. 基本的には、メインの並列領域で下位の並列領域の空きスレッドを使用する必要があります。
現在のシステムを詳しく説明すると、メインの並列領域は 10 個のスレッドを開始します。コアが 12 個あるので、さらに 2 つのスレッドを使用できます。負荷の高いコンピューティングが発生する 2 番目の並列領域があり、最初の 2 つのスレッドがこのポイントに到達して、そこでそれぞれ 2 つのスレッドを持つ新しいチームを開始する必要があります。これ以降、下位の並列領域へのすべての新しいエントリは、シリアルで続行されます。
したがって、これは次のようになります。
メイン領域: 10 個のスレッドが開始されました。
下の領域: 2 つの新しいスレッドが開始されました。
スレッド 1: 下部領域に 2 つのスレッド。
スレッド 2: 下部領域に 2 つのスレッド。
スレッド 3-10: 下部領域に 1 つのスレッド。
これらの数値は、私の状況を明確に説明するためのものであり、プログラムが動作する絶対的かつ唯一のケースではないことに注意してください.
コード:
main() {
...
...
omp_set_num_threads(n);
omp_set_dynamic(x);
#pragma omp parallel
{
#pragma omp for
for (int i = 0; i < iterations; i++) {
...
Compute();
...
}
}
}
そしてコンピュートで
bool Compute() {
...
float nThreads = omp_get_thread_limit() - omp_get_num_threads();
nThreads = ceil(nThreads / omp_get_num_threads());
omp_set_num_threads((int)nThreads);
#pragma omp parallel
{
...
#pragma omp for
for (int i = 0; i < nReductSize; i++) {
...
}
}
}
さて、私の問題は、プログラム全体の上限 (つまり OMP_THREAD_LIMIT) の設定がプログラムの外部からしか機能しないことです。使用する
export OMP_THREAD_LIMIT=5
bashコマンドラインからうまく機能します。でも社内でやりたい。これまでのところ、私は試しました
putenv("OMP_THREAD_LIMIT=12");
setenv("OMP_THREAD_LIMIT", "12", 1);
しかし、omp_get_thread_limit() または getenv("OMP_THREAD_LIMIT") を呼び出すと、おかしな戻り値が返されます。export で変数を設定しても、getenv("OMP_THREAD_LIMIT"); を呼び出します。0 を返します
。ですから、これについてあなたの助けを求めたいと思います: 実行時に OMP_THREAD_LIMIT を適切に設定するにはどうすればよいですか?
これは、スレッドのデフォルトを設定するメイン関数です。スレッド化が発生する前に実行されます。
#ifdef _OPENMP
const char *name = "OMP_THREAD_LIMIT";
const char *value = "5";
int overwrite = 1;
int success = setenv(name, value, overwrite);
cout << "Var set (0 is success): " << success << endl;
#endif
ああ、 setenv は変数の設定に成功したことを報告します。
コンパイラーは
gcc44 (GCC) 4.4.7 20120313 (Red Hat 4.4.7-1) と言っています
フラグ
CCFLAGS = -c -O0 -fopenmp -g -msse -msse2 -msse3 -mfpmath=sse -std=c++0x
OpenMP のバージョンは 3.0 です。