1

gccのOpenMP実装(libgomp)がpthread_exit()を呼び出さないことがわかりました。perfsuite(プロファイリング用)を使用するためにそれが必要です。

OpenMPコードをpthreadコードに変換するときに、OpenMPの並列セクションの最後にpthread_exit()を含めるようにGCCに指示する方法はありますか?

GCC4.7.0とPerfsuite1.1.1を使用しています。

4

1 に答える 1

3

libgompスレッドプールを実装します。プール内のスレッドは、作成されると、スレッド チームのメンバーになるように通知されるまでアイドル状態のままになります。チームが作業を終了すると、スレッドは再びシグナルが送られるまでアイドル ループに入ります。プールはオンデマンドで拡大しますが、縮小することはありません。スレッドは、プログラムの終了時に終了するように通知されるだけです。

libgomp4.7.x ブランチでスレッド プールとチームを実装するコードは、こちらで読むことができます。

プール スレッドは次のように終了します:libgompの名前でデストラクタを登録しteam_destructor()ます。main()関数が戻るexit(3)か、呼び出されるか、libgompライブラリが への呼び出しによってアンロードされるたびに呼び出されますdlclose(3)(以前に でロードされた場合dlopen(3))。pthreadsデストラクタは、 という名前の1 つのキーを削除します。このキーには、削除によってトリガーされるgomp_thread_destructor関連付けられたデストラクタ関数があります。プール内のすべてのスレッドを次のタスクとして実行します。呼び出しが行われるため、プール内のすべてのスレッドが存在しなくなります。gomp_free_thread()gomp_free_thread()gomp_free_pool_helper()gomp_free_pool_helper()pthread_exit(3)

これは、素敵な ASCII 画像での同じプロセスです。

main() returns, exit() called or library unloaded
  |
  |
team_destructor() deletes gomp_thread_destructor
  |
  |
gomp_free_thread() called by pthreads on gomp_thread_destructor deletion
  |
  +-------------------------+---------------------------+
  |                         |                           |
gomp_free_pool_helper()   gomp_free_pool_helper() ... gomp_free_pool_helper()
 installed as next task    installed as next task      installed as next task
  |                         |                           |
  |                         |                           |
pthread_exit(NULL)        pthread_exit(NULL)      ... pthread_exit(NULL)

parallelこれは、各領域の最後ではなく、プログラムの実行の最後に 1 回だけ発生することに注意してください。

于 2012-11-07T10:27:34.197 に答える