はじめに
マルチコアプロセッサーの急速な普及により,消費者と開発者の両方にとって新しい時代が到来しました。消費者にさまざまな可能性が提供される一方で,開発者は新しいマルチコアプロセッサーの優れた処理能力を活用するソフトウェアを開発する必要性に迫られています。
インテルは,マルチコアシステムを活用するためのツール提供を使命としています。その取り組みの一環として,Microsoft Visual Studio C/C++を使用する開発者向けにインテルParallel Studioを発表し,幅広い分野のソフトウェア開発者にParallel Universeへの扉を開きました。ここでは,インテルParallel Studioに含まれる各ツールを紹介します。
並列化の各フェーズを支援するツール
インテルParallel Studioは,コンパイル/デバッグ,エラー検証,パフォーマンス分析といった並列化の各フェーズを支援するツールで構成されています。インテルParallel Composerでは,コンパイラー/デバッガーとスレッド化ライブラリーによって,ソフトウェア開発における並列化の導入を迅速に行うことができます。インテルParallel Inspectorは,事前に「バグを発見」するエラー検出ツールです。並列化プログラミングモデルを問わず,データ競合やデッドロックのような発見が困難なスレッド化エラーを検出し,アプリケーションの信頼性を向上する柔軟なツールです。インテルParallel Amplifierは,スケーリングを制限してしまう予期し難い直列化の発見に役立つパフォーマンス分析ツールです。マルチコアプロセッサー向けに最適なパフォーマンスを発揮する並列アプリケーションのためのきめ細かな調整を行うことができます。
- ※ インテルParallel Advisorは2010年4月現在,テクノロジープレビュー版であるLiteバージョンが提供されている。
インテルParallel Composer
インテルParallel Composerは,並列処理の迅速な導入を支援するコンパイラー,デバッガー,ライブラリーを提供します。広範囲の並列プログラミングモデルがサポートされているため,開発者は開発アプリケーションに最も適したコーディング方法を見つけることができます。
インテルC++コンパイラー
インテルC++コンパイラーはMicrosoft VisualStudio環境に統合され,OpenMP 3.0,ラムダ関数,自動ベクトル化,自動並列化,スレッド化ライブラリーのサポートなど,アプリケーションレベルで並列化を行うための次の拡張機能を提供します。
- ベクトル化サポート
インテル コンパイラーのコンポーネントである自動ベクトライザーは,MMX命令,インテル ストリーミングSIMD拡張命令(インテルSSE,SSE2,SSE3およびSSE4べクトル化コンパイラー命令およびメディアアクセラレータ命令)とストリーミングSIMD拡張命令3補足命令 (SSSE3)を自動的に使用します。
- OpenMP 3.0サポート
インテル コンパイラーは,開発者がソースプログラムで指定したOpenMP宣言子にしたがってコード変換を実行し,マルチスレッドコードを生成します。生成されるコードは,単一プロセッサーシステムおよびマルチプロセッサーシステムの両方で並列実行が可能です。また,OpenMPバージョン3.0仕様に,ランタイムライブラリールーチンおよび環境変数を含むインテル独自の拡張機能を提供します。
- 自動並列化機能
インテル コンパイラーの自動並列化機能は,入力プログラムの直列部分を同等のマルチスレッドコードに自動的に変換します。自動並列化機能は,ワークシェアリング候補のループを特定し,正しい並列実行を確認するためにデータフロー解析を行います。
- C++ラムダ関数サポート
C++ラムダ式は,関数オブジェクトを定義する基本式です。このような式は関数オブジェクトが想定される場所ではどこでも使用できます( 例:Standard TemplateLibrary(STL)アルゴリズムの引数)。インテルC++コンパイラーは,ISO C++ドキュメントで定められているラムダ式を実装しています。/Qstd=c++0xスイッチを使用すると,ラムダサポートが有効になります。
- valarray
ハイパフォーマンスコンピューティング向けの配列演算を含む配列のC++ STL(標準テンプレートライブラリー)コンテナクラスです。これらの演算はベクトル化などのハードウェア機能を活用します。インテル コンパイラーはvalarrayを組み込み型として認識し,インテルIPPライブラリーの呼び出しに置換します。
表1 インテルC++ コンパイラーが提供する代表的なコンパイルオプション
| /O1 | サイズを最適化。オブジェクトのサイズを増やす傾向がある最適化を省略。多くの場合,最小限のサイズで最適化されたコードが作成される。 |
|---|---|
| /O2 | 最速化。ベクトル化を含む多くの最適化を有効にし,多くの場合,/O1よりも速いコードを作成する。 |
| /O3 | /O2の最適化に加えて,スカラー置換,ループアンロール,分岐を除去するコード反復,より効率的にキャッシュを使用するループブロッキングなど,強力なループの最適化およびメモリーアクセスの最適化を行う。 |
| /Qopenmp | OpenMP宣言子がある場合,マルチスレッドコードを生成する処理をパラレライザーに指示。スタックのサイズを増やさなければならないことがある。 |
| /Qparallel | 安全に並列実行可能な単純構造のループを検出し,そのループに対するマルチスレッドコードを自動的に生成する。 |
| /Qax | 自動プロセッサーディスパッチを行う。対象となるインテルプロセッサー向けに専用のコードを生成し,またデフォルトのコードも生成する。カンマで区切って複数の値を指定し,同一ファイルで追加のプロセッサー向けのチューニングを行うことができる。 |
インテルParallel Debugger Extension
インテルParallel Debugger Extensionは並列コード開発機能向けのアドオンデバッガーであり,Microsoft Visual Studioに統合し,次の拡張機能を提供します。
- 異なるスレッドからの同一データ要素へのアクセスを検出するスレッドデータ共有解析
- 再入可能な関数呼び出しでプログラムの実行を停止するスマートブレークポイント機能
- OpenMPの並列ループで動的な追加作業スレッドの作成を有効/無効にするシリアル実行モード
- 高度なOpenMPプログラム状態解析用のOpenMPランタイム情報ビュー
- SIMD(Single Instruction Multiple Data)命令セットを使用して並列データをデバッグするように,形式オプションと編集オプションが拡張されたストリーミングSIMD拡張命令(SSE)レジスタービュー
インテルParallel Debugger Extensionは,ソースインストルメンテーションを使用してデータ共有問題を特定します。この機能を有効にするには,Visual Studio環境から[構成プロパティ]-[C/C++]-[General(全般)]-[Debug(デバッグ)]-[Enable Parallel Debug Checks(並列デバッグ検証を有効にする)]を選択して,/debug:parallelを設定します。
図2はインテルParallel Debugger Extensionが同じデータにアクセスする2つのスレッドを検出して,アプリケーションの実行を停止したことを示しています。
並列化を支援するライブラリー
インテルParallel ComposerはC/C++において使いやすく,ハイパフォーマンスで移植性の高い並列アプリケーションの開発を支援する次の2つのライブラリーを提供します。
- インテルTBB
受賞歴もあるテンプレートベースのランタイムライブラリーです。開発者は並行収集と並列アルゴリズムを活用して,マルチコアプロセッサーの潜在的なパフォーマンスを活用するスケーラブルなアプリケーションを作成することができます。
- インテルIPP
マルチメディア,データ処理,通信アプリケーション向けに高度に最適化された,マルチコア対応ライブラリーです。信号処理,オーディオコーディング,音声認識,音声コーディング,画像処理,ビデオコーディング,小行列の演算,3Dデータ処理などの分野でアプリケーションを作成するための基本的な低レベルの関数が幅広く用意されています。

