スレッド内のOpenMP呼び出し

[戻る]
AR 2010/04/05(月) 10:58:29
 Visual Studio 2008 SP1を当てた状態で、C++よりOpenMPを使用した場合にトラブルに
遭遇しました。

 下記のコードで、ボタン1を押した場合、タスクマネージャのスレッド列で確認する
と数が増えてしまい、開放されていないのです。
 試しに、スレッド内部で呼び出さない形式のボタン2を用意してみましたが、こちら
はきちんと開放されていることが確認できました。

 スレッド内部でスレッドを生成するとは言え、OpenMPの処理は終了時の同期を取って
いるのでスレッドハンドルが開放されないと言うことが解せません。
 何かスレッドハンドルを開放する方法はあるでしょうか?
 宜しくお願いします。


UINT TestThread(LPVOID pParam)
{
    int j = 0;
    #pragma omp parallel for
    for (int i = 0; i < 100000000; i++)
    {
        j = j*i;
    }
    return 0;
}

void OnBnClickedButton1()//ボタン1
{
    AfxBeginThread(TestThread, NULL, THREAD_PRIORITY_NORMAL, 0, 0, NULL);
}

void OnBnClickedButton2()//ボタン2
{
    TestThread(NULL);
}

ryo 2010/04/05(月) 17:14:02
OpenMP使用時にスレッドが無尽蔵に増える問題
http://www.cycleof5th.com/tips/index.php?date=2008-07-29

これかな?

AR 2010/04/05(月) 17:41:16
[[解決]]
ありがとうございます。
原因と結果に納得が行きました。

今回はsectionsでタスク分けてしていましたので、スレッド数を決め打ちで対処しまし
た。
前述の例だと動的にコア数を検出するようにした方が良いようですね。

古いスレッドには追加発言できません。