gccのOpenMP実装(libgomp)がpthread_exit()を呼び出さないことがわかりました。perfsuite(プロファイリング用)を使用するためにそれが必要です。
OpenMPコードをpthreadコードに変換するときに、OpenMPの並列セクションの最後にpthread_exit()を含めるようにGCCに指示する方法はありますか?
GCC4.7.0とPerfsuite1.1.1を使用しています。
libgomp
スレッドプールを実装します。プール内のスレッドは、作成されると、スレッド チームのメンバーになるように通知されるまでアイドル状態のままになります。チームが作業を終了すると、スレッドは再びシグナルが送られるまでアイドル ループに入ります。プールはオンデマンドで拡大しますが、縮小することはありません。スレッドは、プログラムの終了時に終了するように通知されるだけです。
libgomp
4.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 回だけ発生することに注意してください。