[[PageNavi(NavigationList)]] ====== Parallel Inspectorを利用した問題の検出 ====== 最後に、Parallel Inspectorを用いたバグの検出について紹介しておこう。今回のプログラムでは、!__criticalキーワードを用いて複数のスレッドが同時にnr!!OfSolutions変数の値を変更することを防いでいる。そこで、今度はこのキーワードを付けずにプログラムをコンパイルし、エラーを検出させてみよう。 Parallel Inspectorを実行するには、Parallel Inspectorツールバーで検出するエラーを「Memory errors」もしくは「Threading errors」から選択して、「Inspect」ボタンをクリックし('''図10''')、続けて設定画面で分析レベルを指定する。今回はマルチスレッド処理に関する問題を検出したいので、分析する種類を「Threading Errors」とし、分析レベルは「Where are all the threading problems Inspector can find?」(スレッドに関わるすべての問題を対象にする)に設定した。 [[Thumb(76441da6794f147793172fc150f5d04d.png, caption=図10 Parallel Inspectorの実行)]] Parallel Inspectorによる分析が完了すると、まずどのようなイベントが検出されたのか、イベントログが表示される('''図11''')。ここでは、いくつかのデータ競合(Data race)が検出されているので、「Interpret Result」をクリックして検出結果の分析画面を表示させる('''図12''')。この画面では、画面上側に発生した問題が、下側に問題の詳細が表示される。この例では、nq-serial.cppの97行目、setQueen()関数内において、読み出しおよび書き込みについてのデータ競合が発生していることが分かる。 [[Thumb(b038fb1dd9e245cb084dfbaa668d6062.png, caption=図11 Parallel Inspectorのイベントログ)]] [[Thumb(a01aec120f01147f47def2bbe46a20e0.png, caption=図12 Parallel Inspectorのエラー分析画面)]] さらに、この画面で「Sources」をクリックするとソースコードの閲覧画面となり、競合の発生している個所のソースコードが表示される。これにより、先に!__criticalキーワードを外した個所が競合の発生個所となっていることが分かる('''図13''')。 [[Thumb(cf4fb083ce7415ece11263a5ee0ca30d.png, caption=図13 Parallel Inspectorのソースコード閲覧画面)]] ====== 手軽に利用でき、デバッグやプログラムのパフォーマンス向上に役立つParallel Studio ====== 以上のようにParallel StudioはVisual Studioに統合され、非常に簡単にパフォーマンスの向上やパフォーマンスのボトルネック、問題点などを検出できる。これらのコンポーネントは、並列処理を利用しないプログラムにおいても有用なだけでなく、通常のデバッガではなかなか検出しにくいスレッド間の競合やデッドロックなども検出できるなど、マルチスレッドプログラムの開発に非常に役立つ。また、Parallel Composerで導入された新たなキーワードを利用することで、プログラムを比較的手軽に並列化することができる。マルチスレッドプログラムを開発している開発者や、パフォーマンスが必要なプログラムを開発する開発者にとって、Parallel Studioは非常に有用といえるだろう。 [[PageNavi(NavigationList)]]