Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

マルチコア時代の定番チューニングツール
「インテルParallel Studio 2011」

インテルParallel Studio 2011の新機能紹介

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

Parallel Inspector 2011の新機能

 Parallel Inspector 2011は、メモリーリークやスレッド間のデータ競合といった、並列化処理を実装する際に発生する問題も解析可能なツールです。

 今回のバージョンでは、以下のような新機能が追加されています。

  • Cilk Plusのサポート
  • リソースリーク検出機能

 本節ではリソースリーク検出機能について紹介します。

リソースリーク検出

 Parallel Inspectorは以前のバージョンからメモリリークの検出機能を持っていましたが、今回のバージョンから、リソースリークの検出機能が追加されました。これは、WindowsのUI機能を提供するGDIと、カーネルのリソースを取得したまま、解放処理を行っていない箇所について検出する機能です。

 例えば、GDI、カーネルそれぞれで、以下のようにリソースを使用する関数を呼び、使用後にきちんとリソースを開放していない場合、リソースリークが発生します。

表5 GDI、カーネルでリソースを使用する関数と、忘れるとリソースリークになる処理
  呼び出す関数 使用後に行うべき処理
GDI CreateBitmap(ビットマップ作成)
CreateDC(デバイスコンテキスト作成)
CreateFont(フォント作成)など
DeleteObject関数でハンドルの削除
カーネル CreateThread(スレッド作成)
CreateProcess(プロセス作成)
HeapCreate(ヒープオブジェクト作成)など
CloseHandle関数でリソースを削除
(HeapCreate関数に対してはHeapDestroy関数)

 サンプルでリソースリーク検出を確認してみましょう。以下はスレッドを作成したのに、CloseHandle関数を呼び出し忘れたケースです。

CreateThread関数の後処理を忘れてリソースリークが発生するケース
//何もしないスレッド関数
DWORD WINAPI thread(LPVOID vdParam) {
  return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
  //スレッドを生成
  HANDLE hThread = CreateThread(0, 8192, thread, NULL, 0, NULL);
  //CloseHandle関数を呼び忘れた!
  //CloseHandle(hThread);
  return 0;
}

 Visual Studio 2010で以上のソースをビルドし、画面上部のツールバーから、[Inspect]ボタンをクリックします。

図3 Parallel Inspector 2011ツールバーの[Inspect]ボタンで検出処理を行う
図3 Parallel Inspector 2011ツールバーの[Inspect]ボタンで検出処理を行う

 表示される[Configure Analysis]ダイアログでは、[Analysis Type](検出する内容)を[Memory Errors]と[Threading Errors]から選択します。

図4 [Configure Analysis]ダイアログで[Analysis Type]を選択
図4 [Configure Analysis]ダイアログで[Analysis Type]を選択

 それぞれ以下のエラーを検出できます。

表6 Analysis Typeと検出されるエラー
Analysis Type 検出されるエラー
Memory Errors メモリリーク、リソースリークなど
Threading Errors データ競合など

 今回はリソースリークを検出するため[Memory Errors]を選択しましょう。

 また同じダイアログでは、検出の詳細度も選択できます。詳細な検出を行うほど処理時間が掛かります。今回は一番軽い処理の[Does my target leak memory?]を選択しましょう。

 [Run analysis]ボタンをクリックすると、アプリケーションが実行され、終了後エラーが検出されます。今回は図のようにカーネルのリソースリークが検出されています。

図5 Parallel Inspector 2011によるエラー検出結果。[Kernel resource leak]が検出される
図5 Parallel Inspector 2011によるエラー検出結果。[Kernel resource leak]が検出される

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

図6 カーネルリソースリークが発生している行にフォーカス
図6 カーネルリソースリークが発生している行にフォーカス

 小さなサンプルであればこうした問題の発見は手動でも用意ですが、大規模なアプリケーション開発では、以前からサポートされていたメモリリークの検出に加え、今回からサポートされたリソースリークの検出は大いに役立つことでしょう。

まとめ

 今後のアプリケーション開発において、並列化というテーマは不可避になっていくことでしょう。つまり「並列化するか否か」ではなく「どのように並列化するか」を中心に考えていく必要があります。

 Parallel Studio 2011で新たにサポートされたCilk Plusは、複雑なマルチスレッドコードを書くことなく、シンプルな記法で並列化処理を実現することができます。まだ日本語の情報源も少ない状態ですが、ぜひ活用しましょう。

 アプリケーションの並列化において有益な情報源として、Intel社からリリースされているマルチスレッドアプリ開発ガイド」の日本語版がParallel Studio 2011の日本発売元であるエクセルソフト社のサイトで公開されています。

 この開発ガイドでは、マルチスレッドアプリケーションの開発に伴って検討すべき要素を、基本的な理論から具体的な実装方法まで解説しています。(以前のバージョンではありますが)Parallel Studioの実践的な使用方法についても解説していますので、ぜひ参照してください。



  • ブックマーク
  • 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