インテル® TBB のデバッグ、例外機能を使用する

同カテゴリーの次の記事

インテル® TBB ライブラリーと C++11 における正確な例外伝播 (exception_ptr)

この記事は、インテル® デベロッパー・ゾーンに掲載されている「How to Use Debugging, Exception Features in TBB」の日本語参考訳です。


インテル® TBB には、マルチスレッド対応の例外ハンドラーとデバッグ用マクロがあります。この記事では、これらの機能の概要を簡単に説明します。

並列コードの記述は、状況によっては困難で、不具合や奇妙なエラーを引き起こすことがあります。これらの問題に対応するため、インテル® TBB にはデバッグ用マクロと特殊な例外処理が用意されています。最初に、例外処理について説明します。

例外処理

メインスレッドで複数のスレッドをスポーンする場合について考えてみます。そのうちの 1 つが例外をスローした場合、どのように処理したら良いでしょうか? 例外にはいくつかの可能性があり、インテル® TBB は状況に応じて例外を処理します。

1 つ目は、キャンセル可能なタスクグループを使用している場合です。キャンセルを要求した後に例外が発生した場合、その例外は無視されます。インテル® TBB には独自の例外ハンドラーがあり、この例外に対応することができます (すでにタスクグループがキャンセルされているため、エラーは問題にならないと見なされます)。しかし、グループがキャンセルされていない場合、例外ハンドラーはグループをキャンセルします。これは例外ハンドラー内部で行われるため (つまり、例外は処理済みなので)、コードは例外を再スローして、外部のコードに例外を通知します。

通常、あるスレッドが例外をスローした場合、例外ハンドラーはそのスレッド内になければなりません。しかし、そのスレッドは間もなくキャンセルされるため、インテル® TBB は一番外側の (最外) スレッドに例外を再スローするように通知し、最外コードが例外を処理できるようにします。これは細かいことですが、プロセスを理解するのに重要です。

例外が再スローされる仕組みを理解するには、キャプチャーされた例外の概念を理解する必要があります。皆さんからの要望があれば、このトピックについては別の機会に詳しく説明したいと思います。インテル® TBB ドキュメントの説明が参考になります。

デバッグ

アプリケーションのデバッグには、いくつかのアプローチがあります。コンパイル時に、Debug または Release モードを設定できることはご存知でしょう。Debug モードでは、インテル® TBB コードを含めコードをステップごとに実行することができます。それだけではありません。インテル® TBB には、デバッグに役立ついくつかのマクロが用意されています。 一般に、これらの機能を有効にしてコンパイルすると、開発コードでは役立ちますが、製品版コードではパフォーマンスが低下する可能性があるため無効にしたほうが良いでしょう。

次の 3 つのマクロは、コード内でさまざまな機能を有効にします。

TBB_USE_ASSERT

TBB_USE_THREADING_TOOLS

TBB_USE_PERFORMANCE_WARNINGS

インテル® TBB ドキュメントには、TBB_USE_DEBUG マクロに関する記載がありますが、このマクロはほかのマクロにデフォルト値を提供するだけです。これらのマクロの詳細は、インテル® TBB ドキュメントを参照してください。ここで重要なのは、2 つ目の TBB_USE_THREADING_TOOLS です。よく、インテル® TBB をインテル® VTune™ Amplifier やインテル® Inspector などのほかのインテル・ツールと併用することはできますかと聞かれることがあります。この TBB_USE_THREADING_TOOLS を 1 に設定することで、コードをコンパイルする際にほかのインテル・ツールに必要な情報を含めることができます。

まとめ

ここでは、例外処理とデバッグの概要を簡単に説明しました。前述のキャプチャーされた例外や インテル® TBB の特定の例外など、これらに関連するトピックは多数あります。今後の記事で取り上げていきたいと思います。

関連記事