Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

ハイエンドなアプリケーションのためのツール・スイート「インテル Parallel Studio XE 2011」

Parallel Studio XE 2011の新機能紹介

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2010/11/26 14:30
目次

Inspector XEの新機能

 Inspector XEは、メモリーリークやスレッド間のデータ競合といった並列化処理を実装する際に発生する問題を解析するためのツールです。前バージョンであるインテル スレッドチェッカーに対して、以下のような新機能が搭載されています。

  • スレッドエラーに加え、メモリーエラーの検出もサポート
  • C++ Composer XEとの連携による、ソースコードの静的分析によるメモリー、スレッドエラーの検出のサポート
  • .NETマネージコードの解析をサポート

 なお、Inspector XEはインテル スレッドチェッカーからのバージョンアップということもあり、UIはParallel Studio 2011に搭載されたParallel Inspector 2011とはやや異なります。ただし、メモリーエラーやスレッドエラーの検出と、検出後の原因となったソースコードの確認の流れなどは、Parallel Inspector 2011と同様の流れで行うことができます。

 今回は新機能である.NETのマネージコードの解析をサンプルで見てみましょう。

マネージコードのスレッドエラー解析

 Inspector XEのマネージコード解析機能は、現在のところスレッドエラーのみに限られており、メモリーエラーの検出は行えません。

 今回はマルチスレッドでデッドロックが起きるケースについて、解析を行ってみましょう。

 リスト4は、リソースAとBを2つのスレッドが逆の順番で取り合うことにより、デッドロックが起きるケースです。スレッド1はリソースをA、Bの順に、スレッド2はリソースをB、Aの順に取得しようとしますが、実行タイミングによっては2つめに取得するリソースが別のスレッドによってロックされているため、リソースを取得することも、ロックしているリソースを解放することもできなくなってしまいます。

リスト4 デッドロックのサンプル(DeadLockTest\Program.cs)
class Program
{
  private static Object resA = new Object(); //リソースA
  private static Object resB = new Object(); //リソースB

  public static void Main()
    {
      Thread thread1 = new Thread(new ThreadStart(Thread1)); 
      thread1.Start(); //スレッド1開始
      Thread2(); //メインがスレッド2となる
    }

  //A,Bの順でロック
  private static void Thread1()
    {
      lock (resA) //リソースAをロック
        {
          Thread.Sleep(1000);

          lock (resB) //リソースBをロック
            {
              Thread.Sleep(100);
            }
        }
    }

  //B,Aの順でロック
  private static void Thread2()
    {
      lock (resB)
        {
          Thread.Sleep(1000);

          lock (resA)
            {
              Thread.Sleep(100);
            }
        }
    }

}

 Visual Studio 2010で以上のソースをビルドし、図1のような画面上部のInspector XEツールバーから、解析アイコンをクリックします。

図1 Inspector XEツールバーの解析アイコンで解析を行う
図1 Inspector XEツールバーの解析アイコンで解析を行う

 表示される[Configure Analysis Type]画面では、[Analysis Type](検出する内容)を[Memory Error Analysis]と[Threading Error Analysis]から選択できます。今回はスレッドエラーを検出するため[Threading Error Analysis]-[Detect Deadlocks]を選び、[Terminate on deadlock]をチェックして[Start]ボタンを押します。このチェックは、デッドロック発生時にアプリケーションを終了させるためのものです。

図2 [Threading Error Analysis]-[Detect Deadlocks]を選択する
図2 [Threading Error Analysis]-[Detect Deadlocks]を選択する

 アプリケーションの実行中、複数のスレッドによってデッドロックが発生したことをInspector XEが検出すると、自動的にアプリケーションを終了させます。

 解析結果の収集が行われた後、図3のような検出結果画面が表示されます。画面上部(Problems部分)に問題が表示され、下部(Code Locations)に問題となるコードの箇所が表示されます。今回はDeadlockがProgram.csの4つの行で発生していることが確認できます。

図3 Inspector XEによるエラー検出結果。[Deadlock]が検出される
図3 Inspector XEによるエラー検出結果。[Deadlock]が検出される

 該当する行をダブルクリックすると、以下のように該当する行が表示されます。

図4 デッドロックが発生している行にフォーカス
図4 デッドロックが発生している行にフォーカス

 これまでネイティブコードに限定されていた並列化エラーの解析がマネージコードでも可能になったことは大きなメリットです。もちろんInspector XEではネイティブコードにおけるメモリーエラー、スレッドエラーの解析機能も向上していますので、並列化アプリケーションの実装の際に発生する問題の解決に役立つことでしょう。


  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XMLD...

  • WINGSプロジェクト 土井 毅(ドイ ツヨシ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5