THE PARALLEL
Issue 10

2012 年 6 月

UNIVERSE

6 ステップの将来も通用するアプリケーションの生成
Shannon Cepeda、Wendy Doernerインテル® Cilk™ Plus

パフォーマンス・ブースター
インテル® Cilk™ Plus がオープンソースになり GCC* 4.7 に対応しました。
インテル® Cilk™ Plus の 3 つのキーワードは、簡単で強力な並列プログラミング・モデルを提供します。

›ランタイム・ライブラリーとテンプレート・ライブラリーにより、並列アプリケーションのビルド用に適切にチューニングされた環境を提供します。
› Linux*、Windows*、オープンソース、GCC* 4.7 の C++/Fortran 開発者に最適です。

インテル® Parallel Studio XE の詳細Ⓒ2012 Intel Corporation.無断での引用、転載を禁じます。Intel、インテル、Intel ロゴ、Cilk、Intel Atom、Intel Core、Pentium、Xeon、VTune は、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

PARALLEL UNIVERSE

目次
編集者からのメッセージ

パフォーマンス向上への取り組み:
具体的な実現方法 - クラスターからデバイスまで
JAMES REINDERS

6 ステップのベクトル化による将来も通用するアプリケーションの生成

WENDY DOERNER、SHANNON CEPEDA

4
6

ベクトル化は、データ並列化をサポートする重要なハードウェア機能で、単一プロセッサー・
コア内で並列にデータを処理できるようにし、パフォーマンスを大幅に向上させます。スレッ
ド化やクラスター並列化と組み合わせることもできます。

さまざまな環境に応じた並列計算

ROBERT MUELLER、NOAH CLEMONS、PAUL FISCHER

12スモール・フォーム・ファクター・デバイスで動作するアプリケーションにパフォーマンス・ラ
イブラリー関数を利用することは、データ集約型タスクの計算実行フローを合理化して統一する優れた方法です。この記事では、インテル® Atom™ プロセッサーでインテル® インテグ
レーテッド・パフォーマンス・プリミティブ（インテル® IPP）を活用する方法を検討します。

.NET アプリケーションの信頼性とパフォーマンスを高めるツール
LEVENT AKYIL、ASAF YAFFE

20.NET コード、ネイティブコード、「混合」（.NET およびネイティブ）アプリケーションの開発サ
イクルで開発者を支援する最新のソフトウェア・ツールの機能を紹介します。

Ⓒ 2012 Intel Corporation.無断での引用、転載を禁じます。Intel、インテル、Intel ロゴ、Cilk、Intel Atom、Intel Core、Pentium、Xeon、VTune は、アメリカ合衆国および / またはその他の国における Intel

Corporation の商標です。* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

3

PARALLEL UNIVERSE

パフォーマンス向上への取り組み :

具体的な
実現方法

〜クラスターから
デバイスまで〜

4

インテル® ソフトウェア製品のパフォーマンスおよび最適化に関する注意事項については、http://software.intel.com/en-us/articles/optimization-notice/#opt-jp を参照してください。

PARALLEL UNIVERSE

編集者からのメッセージ
James Reinders は、インテル コーポレーションのチーフ・エバンジェリストです。
『Intel Threading Building Blocks: Outfitting C++ for Multicore Processor
Parallelism』（日本語:『インテル スレッディング・ビルディング・ブロック ―マ
ルチコア時代の C++ 並列プログラミング』、中国語、韓国語の翻訳版があります）などの並列化に関する文献を発表しています。また、並列化に関する幅広いインタビューも受けています。

アプリケーションのパフォーマンスを向上させるテク

そして、「.NET アプリケーションの信頼性とパフォーマンスを高め

ニックとヒントがさまざまなソフトウェア技術者から寄せられたこるツール」では、インテル® Parallel Studio XE に含まれる 2 つのツーの号も、開発者に必見の情報が満載されています。優れた結果をル（エラー検出ツール インテル® Inspector XE とパフォーマンス分得るために複雑にする必要はありません。基本的な並列化プロセ

析ツール インテル® VTune™ Amplifier XE）が .NET コード、ネイティ

スの多くは、インテル® ソフトウェア開発ツールを利用して効率良

ブコード、
「混合」
（.NET およびネイティブ）アプリケーションの開く行うことができます。

発サイクルにおいてどのように開発者に役立つかを説明します。

「6 ステップのベクトル化による将来も通用するアプリケーション

この号で紹介するコードを実際に試し、開発プロセスとソフトの生成」では、複数のデータに対して特定の処理を一度に実行する、ウェアに与える影響を検証して、皆さんがパフォーマンス・ツール

ベクトル並列化と呼ばれる並列化手法を紹介します。スケールフォ

キットの幅広い活用方法を習得し、パフォーマンスを大幅に向上さワード手法を用いることで、新しいアーキテクチャーやプロセッサー

れることを願っています。

に合わせてコードを変更することなく、コードをベクトル化することができます。
「さまざまな環境に応じた並列計算:インテル® Atom™ プロセッ
サーでインテル® インテグレーテッド・パフォーマンス・プリミティブ（インテル® IPP）を活用する」では、モバイル・アプリケーションの開発者にとって興味深い手法を用いて、スモール・フォーム・ファク
ター・デバイスに並列化を適用する方法を紹介します。

James Reinders

PARALLEL UNIVERSE

6 ステップの将来も通用するアプリケーションの生成
6

インテル コーポレーション
ソフトウェア・テクニカル・コンサルティング・エンジニア

Wendy Doerner、Shannon Cepeda

インテル® ソフトウェア製品のパフォーマンスおよび最適化に関する注意事項については、http://software.intel.com/en-us/articles/optimization-notice/#opt-jp を参照してください。

PARALLEL UNIVERSE

デベロッパー・ロックスター:

Shannon Cepeda

Wendy Doerner

単一プロセッサー・コアでデータを並列に処理することでパフォーマンスを大幅に向上させる方法を紹介します。そして、スレッド化とクラスター並列化を組み合わせて、さらなるパフォーマンス向上を図ります。

PARALLEL UNIVERSE

Parallel Universe ではこれまで、スレッド化やクラス
ター・プログラミングによって複数のコアを活用することを目標とベクトル化はどのように動作するかした、並列化に関する多くの記事を掲載してきました。この記事で典型的なスカラー（非ベクトル）の場合、使用する変数はそれぞれ、独自は、ベクトル並列化と呼ばれる重要な並列化手法を紹介します。ベ

のプロセッサー・レジスターに別々に格納されます。2 つの変数で加算をクトル化は、データ並列化をサポートするハードウェア機能で、単実行すると、2 つのレジスターの内容が加算され、結果がレジスターに戻一プロセッサー・コア内で並列にデータを処理します。

されます。この例のベクトル化では、最初に加算対象の複数の変数をベクトル化によって、複数のデータに対して特定の処理を一度に実行することができます。この処理は、SIMD (Single Instruction

レジスターに「パック」します（埋めます）。例えば、インテル® AVX 対応のプロセッサーでは、最大 8 つの単精度浮動小数データ要素

Multiple Data）と呼ばれる特別な命令を使用して行われます。

を 1 つのレジスターにパックできます。そして、1 つの SIMD 命令

SIMD 命令と SIMD 命令に対応するインテル® プロセッサーは、10により、これらのデータ要素と別の要素がパックされたレジスター

年以上にわたり進化し続けてきました。インテル独自の SIMD 命令を使って操作し、一度に複数の結果を生成します。これらの操作はセットであるインテル® ストリーミング SIMD 拡張命令（インテル®

別々ではなく並行に行えることから、適切なコードでは大幅なパSSE）は、1999 年に最初に導入された後、数回の拡張が行われてフォーマンス向上を達成できます。

います。2011 年には、インテル® アドバンスト・ベクトル・エクステンション（インテル® AVX）が登場しました。

スカラーモード

SIMD 処理a[i]aa [ i+7 ] a [ i+6 ] a [ i+5 ]a [ i+4 ] a [ i+3 ] a [ i+2 ]a [ i+1 ]

a[i]

+

+

b[i]

b

b [ i+7 ] b [ i+6 ] b [ i+5 ]b [ i+4 ] b [ i+3 ] b [ i+2 ]b [ i+1 ]b[i]a[i]+b [ i ]a+bc[i+7]

c[i+4]

c[i+1]c[i]c[i+6]

c[i+5]

c[i+3]

c[i+2]

図 1: 配列要素に適用された SIMD 加算「ベクトル化により、単一プロセッサー・コア内
で並列にデータを処理することが可能になり、パフォーマンスが大幅に向上します。ベクトル化
は、スレッド化やクラスター並列化と組み合わせることもできます... 推奨されるいずれかの手法を使用してコードをベクトル化することで、現在のパフォーマンスが改善し、さらに将来のスケー
リングが可能になる（フォワード・スケーリング）という 2 つのメリットが得られます。」

8

インテル® ソフトウェア製品のパフォーマンスおよび最適化に関する注意事項については、http://software.intel.com/en-us/articles/optimization-notice/#opt-jp を参照してください。

PARALLEL UNIVERSE

図 1 に示すように、ベクトル化は通常、ループで処理される配列やベクトルデータ要素に対して行われます。加算以外にも、多くの算術関
数、論理演算、文字列操作用の SIMD 命令が用意されています。SIMD
命令セットは、大規模なデータセットを処理するアプリケーション向けに設計されています。科学、工学、金融、メディア、グラフィック分野はもちろん、これまでの説明に当てはまるアプリケーションはすべてベク
トル化の候補です。

BLOG
highlights

コードをベクトル化する方法
開発者はアプリケーションにおいてさまざまな方法で SIMD 命令を利用することができます。従来のベクトル化は、アセンブリー・コードやコンパイラーの組込み関数を使用して、SIMD 命令とレジスターを直接操作して行われていました。この手法では、開発者が SIMD アーキテ
クチャーを理解し、プロセッサーに合わせてコードを手動でチューニングする必要があります。さらに、コードの開発と維持に多大な労力がかかるだけでなく、アセンブリーや組込み関数でベクトル化を行うと、コードを別のコンパイラーに単純に移植することはできません。対象とする SIMD ハードウェアごとにコードを記述する必要があるため、この手法によるベクトル化はスケールフォワードではなく、新しいプロセッサーが出るたびに再度実装が必要になります。
幸い、今日ではより少ない労力でスケールフォワード可能なベクトル化の手法を選択することができます。
下記のテクニックはベクトル化を行うコンパイラーに依存します。ここでは、C++ および Fortran で利用可能なインテル® コンパイラーを使用することを推奨します。インテル®
コンパイラーには高度なベクトライザーが含まれており、ベクトル化をサポートするさまざまなオプション、レポート、拡張機能が用意されています。
「6 ステップのベクトル化」プロセスでは、これらの機能のいく
つかを利用します。

インテル® Cilk™ Plus プログラムのシリアル同値性
インテル コーポレーション
ROBERT GEVAC++ コミュニティーには、機能をライブラリーとして追加し、
言語キーワードの追加を避ける傾向があります。これらの傾向と一致しているのは、インテル® スレッディング・ビル
ディング・ブロック（インテル® TBB）と Microsoft* Parallel
Patterns Library (PPL) です。さて、ここで 1 つの疑問が生じます。インテル® Cilk™ Plus はなぜライブラリーではなく言語拡張として実装されたのでしょうか。
1 つの答えは、言 語がコンパイラーによって実 装されることで、コンパイラーは一定の保証ができるようになるためです。その保証の 1 つにシリアル等価性があります。並列化の 3 つのキーワードを使用するインテル®
Cilk™ Plus プログラムにはすべて、定義済みのシリアル
エリジョン（省略コード）があります。シリアルエリジョン
は、cilk_spawn と cilk_sync をぞれぞれ空白に、cilk_for を for キーワードに置換して定義されます。明らか

スケールフォワードの手法に、インテル® Cilk™ Plus プログラムのシリアルエリジョン

下記のいずれかの手法でコードをベクトル化すると、将来のアーキテ

論理的に並列な 2 つのストランドが同じメモリー位置

クチャーやプロセッサーでも変更を加えることなくベクトル化が行われます。将来のアーキテクチャーでコンパイルを行うと、インテル® コン
パイラー（またはこの手法を完全にサポートするコンパイラー）は、
適切なベクトル化の方法を選択します。
> インテル® コンパイラーの自動ベクトライザーを使用する : 有効な場合、コンパイ
ラーの自動ベクトライザーは、ソースコードを変更することなくループをベクトル化できないかを調べます。ベクトル化フレンドリーなコードでは、ほかの手法は必要ありません。ただし、ループを並列に操作しても安全であることが証明できなければ、コンパイラーはループをベクトル化しません。そのため、この手法に下記のいずれかのテクニックを組み合わせてベクトル化を行うことになります。
> インテル® Cilk™ Plus で提供される高レベルの構造を使用する : インテル® Cilk™
Plus は、並列化とベクトル化をサポートする C/C++ 用の言語拡張です（一部はFortran にも対応）。現在、インテル® コンパイラーでは完全に、GCC* では部分的にサポートされています。インテル® Cilk™ Plus はオープン・スタンダードです（詳細は、cilk.com を参照）
。インテル® Cilk™ Plus は、コードに追加してベクトル化が必要なことをコンパイラーに知らせる、さまざまな構造を提供します。これ
らの構造の多くは、表記を変更したりプラグマを追加するだけで、コードに簡単に実装することができます。
> 高レベルの Fortran 構造を使用する : Fortran には、配列表記（アレイ・ノー
テーション）や DO CONCURRENT ループのようなベクトル化フレンドリーな機能が含まれています。インテル® Cilk™ Plus のベクトル化指示句 (!DIR$ SIMD) は、
Fortran でも利用可能です。インテル® Cilk™ Plus と同様に、これらの構造はベク
トル化できる部分をコンパイラーに知らせるために使用されます。

は有効な C/C++ プログラムです。
にアクセスして、少なくともその 1 つがそのメモリー位置を修正する場合、プログラムには決定性競合があります。インテル® Cilk™ Plus の並列プログラムに決定性競合がなければ、シリアルエリジョンと同じ結果になるでしょう。コンパイラーがシリアル同値性を保証することで何がもたらされるのでしょうか。次のようなコードについて考えてみます...

この記事の続きはこちら（英語）でご覧になれます。

Go-Parallel.com（英語）でご覧になれます。
Go Parallel では、この他にも次のような関連トピックのブログをご覧いただけます : Translating Multicore Power
into Application Performance（マルチコアのパワーで
アプリケーション・パフォーマンスを引き出そう）。

9

PARALLEL UNIVERSE

アプリケーションをベクトル化する
6 ステップのプロセスステップ 2: インテル® VTune™ Amplifier XE を使用して hotspot
を特定する

前述の手法とインテル® コンパイラーは、アプリケーションをベク

XE を使用して、アプリケーションで最も時間を費やしている関数をトル化する 6 ステップのプロセスの一部です。アプリケーション

特定します。ライト hotspot 解析タイプ（システム全体をプロファイ

パフォーマンス・プロファイラーであるインテル® VTune™ Amplifier

全体、あるいはその一部に、この手法を試すことができます。このル）でも必要な結果が得られますが、hotspot 解析タイプ（アプリ

プロセスの実行を支援するため、各ステップを詳細に説明したベケーションのみをプロファイル）を推奨します。

クトル化ツールキット（オンライン）を用意しました。ツールキッ

最も時間を費やしているコード領域を特定することで、最も効果

トには、関連情報へのリンクも含まれています。ツールキットにつ的にパフォーマンスを向上できる領域に最適化の労力を集中でき

いては、http://software.intel.com/en-us/articles/vectorization-

ます。一般に、アプリケーションの実行時間の 10% 以上を占めて

toolkit/（英語）を参照してください。

いる hotspot を解消すれば十分です。次のステップで対象にする
hotspot をメモしておきます。

ステップ 1: 基準となるリリースビルドのパフォーマンスを測定する
まず、ベクトル化による効果があったかどうか分かるように、パフォー
マンスの基準が必要です。さらに、目標とするパフォーマンスのレベルを設定することで、目標に到達したかどうかを知ることができます。

ステップ 3: インテル® コンパイラーのベクトル化レポートを使用してループの候補を決定する
インテル® コンパイラーのベクトル化レポートは、コードの各ループがベクトル化されたかどうかを示します。自動ベクトライザーが有効に

パフォーマンスの測定には、デバッグビルドではなくリリースビル

なるように、最適化レベル 2 または 3（-O2 または –O3）を指定してドを使用すべきです。リリースビルドには最終的なアプリケーショ

いることを確認します。ベクトル化レポートを実行して、ステップ 2 でンで使用するすべての最適化が含まれていて、hotspot や実行され特定した hotspot に対するレポートを確認します。hotspot 内にベクトるコードがデバッグビルドと異なる場合があるためです。例えば、リル化していないループがある場合、並列のデータ（つまり配列）で数

リースビルドでは、ベクトル化の候補となる hotspot 内のループを学演算、データ処理、文字列操作を行っていないか確認します。これ最適化してしまうことがあります。

らの処理を行っている場合は、ベクトル化の候補となります。ベクト

インテル® コンパイラーでは、
リリースビルドがデフォルト設定です。最適化を無効にするには、Windows* の場合はデバッグビルド（または -Zi
オプション）、Linux*/Mac OS* X の場合は -Od オプションを使って、明示的に指定します。インテル® コンパイラーを使用している場合は、自動ベル化の候補が見つかったら、ステップ 4 に進みます。
ベクトル化レポートを実行するには、-vec-report2（Linux* および Mac
OS* X）または /Qvec-report2（Windows*）オプションを指定します。
インテル® コンパイラーはコードの一部だけで使用することもで

クトライザーが有効になるように、最適化レベル 2 または 3（-O2 またはき、ネイティブ・コンパイラーである gcc（Linux* および Mac OS* X）–O3）を指定していることを確認してください。

および Microsoft* Visual Studio*（Windows*）と互換性があります。

図 2:インテル® VTune™ Amplifier XE の hotspot ビュー.\main.cpp(30): 警告 :ループがベクトル化されました。
.\scalar_dep.cpp(80): 警告 :ループがベクトル化されました。
.\main.cpp(47): 警告 : ループはベクトル化されませんでした: 内部ループではありません。
.): 警告 : ループはベクトル化されませんでした: 非標準のループはベクトル化候補ではありません。
.): 警告 : ループはベクトル化されませんでした: 非標準のループはベクトル化候補ではありません。
.): 警告 : ループはベクトル化されませんでした: ベクトル依存関係が存在しています。
.): 警告 : ループはベクトル化されませんでした: 内部ループではありません。
.): 警告 : ループはベクトル化されませんでした: ベクトル依存関係が存在しています。
.): 警告 : ループはベクトル化されませんでした: 内部ループではありません。
.): 警告 : ループはベクトル化されませんでした: ベクトル依存関係が存在しています。
.): 警告 : ループはベクトル化されませんでした: 内部ループではありません。
図 3: インテル® コンパイラーのベクトル化レポートの出力10インテル® ソフトウェア製品のパフォーマンスおよび最適化に関する注意事項については、http://software.intel.com/en-us/articles/optimization-notice/#opt-jp を参照してください。

PARALLEL UNIVERSE

ステップ 4: インテル® コンパイラーの GAP レポートとツールキットのリソースを使用してアドバイスを得る

インテル® コンパイラーのガイド付き自動並列化（GAP）レポートをステップ 6: 繰り返す !

パフォーマンスが目標に到達するか、hotspot に候補が見つからなくなるまで、プロセスを繰り返します。

実行して、ステップ 3 で候補にしたループをベクトル化する方法についてコンパイラーのアドバイスを確認します。アドバイスを検討し、必要に応じてツールキットのリソースを参照します。
-guide（Linux* および Mac OS* X）または /Qguide（Windows*）
オプションを指定して、GAP レポートを実行します。
注 : 必要な場合は、アプリケーションの一部でインテル® コンパイラー
を使用することができます。

for (i=0; i<n; i++) {		b = A[i];if (A[i] > 0) {A[i] = 1 / A[i];}if (A[i] > 1) {A[i] += b;}}
図 6: 図 4 のループをベクトル化したもの

まとめ
for (i=0; i<n; i++) {		
if (A[i] > 0) { b=A[i]; A[i] = 1 / A[i]; }if (A[i] > 1) { A[i] += b;}}
図 4: 非ベクトル化ループの例

ベクトル化により、単一プロセッサー・コア内で並列にデータを処理することが可能になり、パフォーマンスが大幅に向上します。ベ
クトル化は、スレッド化やクラスター並列化と組み合わせることもできます。インテル® Xeon® プロセッサー・ファミリーやインテル®
Core™ プロセッサー・ファミリーのような最新のインテル® プロセッ
サーのパフォーマンスを向上するには、ベクトル化が不可欠です。

scalar_dep.cpp(80): 警告 #30515:(VECT) 変数 b に、
ループ本体の最初 (行 80) で値を代入します。これにより、
ル ープが ベクトル 化されます。[ 確 認 ] プログラムにおいて
ループの各反復で変数b の読み込みを行う場合は、変数がその反復以前に定義されていなければなりません。
図 5: 図 4 のループの GAP アドバイス

将来は、これらのプロセッサーに加えて、インテル® メニー・インテ
グレーテッド・コア（インテル® MIC）アーキテクチャーでもパフォー
マンス向上の鍵を握ることになるでしょう。
推奨されるいずれかの手法を使用してコードをベクトル化することで、現在のパフォーマンスが改善し、さらに将来のスケーリン
グが可能になる（フォワード・スケーリング）という 2 つのメリットが得られます。ベクトル化のための最新のアドバイス、プロセス、リステップ 5: GAP のアドバイスとその他の推奨事項

ソースについては、ベクトル化ツールキット（英語）サイトを参照しループに対する GAP レポートのアドバイスのうち、可能なものを実語）Web セミナーも是非ご覧ください。

（要素関数や配列表記の使用など）を実装するてください。また、「将来も通用するアプリケーションの生成」
（英

装します。
レポートは、コードの変更をアドバイスすることがあります。コードを変更する場合は、コードを変更しても「安全」であること、つまり、ループのセマンティクスや安全性に影響がないことを確認します。依存性がないことを保証する 1 つの方法は、ループを逆に実行したときに結果が変わるかどうかをチェックすることです。ランダ
ムな順序でループを実行したときの結果を確認するのも 1 つの方法です。結果が変わる場合、ループには依存性があり、ベクトル化
は「安全」ではありません。ただし、この場合でも、依存性を排除してからベクトル化を行うことは可能です。
ソースを変更して、適切なベクトル化が行われるように、コンパイ
ラーに情報を知らせるか、ループを最適化します。
このとき、インテル® Cilk™ Plus または Fortran により提供される高レベルの構造を使用することができます。利用可能な構造の詳細は、オンラインのベクトル化ツールキットをご覧ください。

11

PARALLEL UNIVERSE

12

インテル® ソフトウェア製品のパフォーマンスおよび最適化に関する注意事項については、http://software.intel.com/en-us/articles/optimization-notice/#opt-jp を参照してください。

PARALLEL UNIVERSE

さまざまな環境に応じた

並列計算

インテル® Atom™ プロセッサーでインテル® インテグレーテッド・
パフォーマンス・プリミティブ（インテル® IPP）を活用する
インテル コーポレーション
ソフトウェア・テクニカル・コンサルティング・エンジニア

Robert Mueller、Noah Clemons、Paul Fischer

PARALLEL UNIVERSE

インテル® IPP のようなパフォーマンス・ライブラリーが、スモール・フォーム・ファクター・デバイス向けのアプリケー
ションにおいて、データ集約型タスクの計算実行フローの合理化と統一にどのように役立っているかを紹介します。
インテル® Atom™ プロセッサー・ベースのスモール・フォー
ム・ファクター・デバイス（インテリジェント・システム）で動作するア
プリケーションにパフォーマンス・ライブラリー関数を利用することは、データ集約型タスクの計算実行フローを合理化して統一する優れテリジェント・システム は 長 期 間 利 用 され ること が 多く、関数を手動で最適化することは保守の負担も大きくします。
図 1 に示すように、信号処理と高度なベクトル演算は、異なる種類のインテリジェント・システムで広く利用されている 2 つの関数ドメイた方法です。その結果、データストリームのタイミング問題のリスクや、ンです。DSP は、これらの種類の計算タスクを行う汎用プロセッサー

いわゆるハイゼンバグと呼ばれる現象を最小限に抑えられます。ハイを支援するのによく利用されます。DSP は、独自の定義済みアプリ

ゼンバグは、システム・オン・チップ（SoC）コンポーネントやデジタル・ケーション・インターフェイスとライブラリー関数セットとともに提供

シグナル・プロセッサー（DSP）デバイスの微妙なタイミングのずれにされます。通常は、汎用目的のタスクには適していません。DSP は、基よって発生する、再現の難しい（多くの場合はランダムな）ランタイム

本的な数学演算（加算、減算、乗算、除算）を高速に実行できるよう問題です。

に設計されています。DSP のレパートリーには、畳み込み、内積、そのインテル® IPP のようなパフォーマンス・ライブラリーには、信号

他の複数オペランドの数学演算で頻繁に使用される行列評価に特化

処理、画像処理、ビデオ/オーディオのエンコーディング/デコーディ

した非常に高速な積和演算（MAC）命令のセットが含まれます。DSP

ング、暗号化、データ圧縮、音声コーディング、コンピューター・ビ

アプリケーションのコードの多くを占める MAC 命令は、インテル® スト

ジョンを含む、一般的な関数向けに高度に最適化されたアルゴリ

リーミング SIMD 拡張命令 3 補足命令（インテル® SSSE3）に相当しま

ズムとコードが含まれます。高度な命令セットは、特定のアプリ

す。DSP の MAC 命令のように、これらのインテル® SSSE3 命令は、ベケーション向けに特別に用意された新しいプロセッサーの機能をクトルと配列データで非常に効率良く数値演算を実行します。DSP と開発者が活用できるように支援します。開発者は、あたかも低消は異なり、インテル® Atom™ プロセッサーの SIMD 命令は、すべての計費電力デバイスまたは組込みデバイス向けの計算を行うブラック

算が同じプロセッサーで実行され、1 つにまとめられた論理実行ストボックスのようにインテル® IPP を呼び出し、データを渡して結果

リームの一部であるため、複素ベクトルと配列数学アルゴリズムを使を受け取ります。このようにインテル® IPP を使用することで、特定用してアプリケーションに簡単に統合できます。

の計算タスク用に作成された多くの処理を代わりに行うことが可

例えば、画像の各ピクセルに定数値を加えて（または引いて）画像

能になります。インテル® IPP は、インテリジェント・システムでインの明るさを変更するアルゴリズムは、メモリーから RGB 値を読み取

テル® Atom™ プロセッサーが利用されるさまざまな領域（図 1）り、オフセットを加えて（または引いて）、新しいピクセル値をメモリーに対応しています。

に書き込む必要があります。DSP コプロセッサーを使用する場合、画

高 度 に 最 適 化 され た パ フォーマンス・ライブラリーなしで像データを DSP 向けにパックし（DSP によってアクセス可能なメモ十 分な 性 能を得 るには 、大 量 の 計 算 が 行 われ る関 数 を開 発

リー領域に配置し）、変換アルゴリズムを実行するようにシグナルを者 が 注 意 深く手 動で 最 適 化する必 要があります。この 最 適 化

送信した後、汎用プロセッサーに処理を戻す必要があります。SIMD 命

プロセスは 、複 雑 で 時 間 がかかるだけ でなく、プロセッサー

令に対応した汎用プロセッサーを利用すると、データセットをパックの 世 代 が 新しくなるたびに更 新しなけ れ ば なりません 。インし、シグナルを送信して、返すという一連のプロセスを単純化できま

データ完全性リアリスティック・
レンダリング
ストリング処理

行列 / ベクトル演算
音声コーディング
オーディオ・コーディング
ビデオ圧縮
画像圧縮
コンピューター・ビジョン

航空宇宙 / 防衛

ネットワーク機器

•

•

•
•
•
•
•
•
•

•
•
•

画像カラー変換
画像処理
信号処理
暗号化
データ圧縮

•
•
•

•
•
•

家電

医療

•

•
•

•
•
•
•
•

•

•
•
•

•
•
•
•
•

•
•

工業

自動車

•

•
•
•
•

•
•
•

•
•

図 1: 組込み分野向けのインテル® IPP の関数ドメイン
14

インテル® ソフトウェア製品のパフォーマンスおよび最適化に関する注意事項については、http://software.intel.com/en-us/articles/optimization-notice/#opt-jp を参照してください。

PARALLEL UNIVERSE

ippsCopy: インテル® Core™ i7 プロセッサー向け

アプリケーション・コード:
void main (void){ ...
ippsCopy();...
}ippsCopy: インテル® Core™2 プロセッサー向け
ippsCopy: インテル® Atom™ 2 プロセッサー向け
ippsCopy: インテル® Pentium® 4 プロセッサー向け
ippsCopy: すべての IA-32 プロセッサー向け

図 2: プロセッサーごとにライブラリーをディスパッチ

す。インテル® IPP ライブラリーのプリミティブは、ぞれぞれの SIMD 命
令セット・アーキテクチャーに合わせて最適化されているため、ライブ
ラリーには複数のバージョンのプリミティブが存在します。
インテル® IPP は、さまざまなインテル® アーキテクチャー・ベースのプロセッサーで再利用できます。自動ディスパッチにより、関係のある> 異なるアーキテクチャーに基づくヘテロジニアス非同期マルチプロセシング（AMP）。
> 同期マルチプロセシング（SMP）。インテル® ハイパースレッディング・テクノ
ロジーと低消費電力のインテリジェント・システム用に設計された最新世代のインテル® Atom™ プロセッサーで使用されているデュアルコア・デザイン
を活用します。

関数の呼び出しを変更しなくても、開発者が用意したコードは常に対象のアーキテクチャー向けに最適化された実行フローを選択して実行

この 2 つの概念は、しばしば同じ SoC で共存します。フェイルセー

します（図 2）。データ解析と集約にインテル® Core™ プロセッサーをフのリアルタイム要件を備えたコードは、独自のラッパー内で保護さ使用し、データの前処理と収集にインテル® Atom™ プロセッサー・ベー

れ（変更したラウンドロビン・リアルタイム・スケジューラーによってスの SoC を使用している組込みシステムでは特に有効です。このシナ管理される）、残りのオペレーティング・システム（OS）レイヤーとアリオでは、同じコードベースがインテル® Atom™ プロセッサーの SoC

プリケーション・レイヤーは、標準の SMP マルチプロセシング概念（フィールド）とインテル® Core™ プロセッサー（中央のデータ集約ポを使用して管理されます。インテル® ハイパースレッディング・テクノイント）でそれぞれ使用されます。

ロジー対応の 2 つの物理コアを搭載したインテル® Atom™ プロセッ

限られたユーザー・インターフェイスのみを備えたデータ・スト

サーは、仮想クアッドコア・システムになります。さらに、インテル®

リーミングや I/O 制御用の専用の SoC コンポーネントでは、インテル®

Atom™ プロセッサーはインテル® SSSE3 命令セットをサポートしま

Atom™ プロセッサーの最適化や並列性を活用する機会はほとんどなす。さまざまなインテル® IPP 関数（http://software.intel.com/en-us/

いと考えられがちですが、実際には次の処理に活用できます。

articles/new-atom-support/）が、インテル® Atom™ プロセッサー・
アーキテクチャーとインテル® SSSE3 を活用できるようにチューニン
グされています（図 3）。
高スループットが求められるアプリケーションは、インテル®

IPP

SSSE3 ベクトル命令の便利さと、SIMD 処理用の広いベクトルレジス
ターで複数のデータストリームを並列に実行することにより恩恵が

SSSE3
SIMD

得られます。前述したように、最新のインテル® Atom™ プロセッサー
は、最大 4 つの仮想プロセッサー・コアを搭載するように設計されています。スレッド化の際は、この点を考慮する必要があります。すべてのアプリケーションに適した普遍的なスレッド化ソリューション

CPUはありませんが、インテル® IPP はスレッドセーフになるように設計されています。
> ライブラリー内のプリミティブは、アプリケーション内の複数のスレッドから同時に呼び出せます。

図 3: インテル® IPP は、インテル® Atom™ プロセッサーおよびインテル® SSSE3 セットを活用するようにチューニングされています。

> 選択するスレッド化モデルによって粒度は異なります。
> インテル® IPP 関数は、OpenMP* により、プロセッサー・コアを直接利用することができます。
> インテル® IPP 関数は、ネイティブスレッド、インテル® Cilk™ Plus、またはその他のインテルの並列モデルを使用する、OS レベルのスレッド化と組み合わせることができます。

15

PARALLEL UNIVERSE

インテル® IPP を広範囲に使用するアプリケーションをマルチス

低消費電力のインテリジェント・システム用のソフトウェアを開発

レッド化する最も迅速な方法は、ライブラリーにビルトインされていする場合、パフォーマンスと保守性に加えて、フットプリントと消費

る OpenMP* のスレッド化機能を利用することです。大幅にコードを電力も考慮する必要があります。命令ベースで見た場合、SIMD 命令

書き直す必要はありません。ただし、スレッド化されているインテル®

のほうが非 SIMD 命令よりも消費する電力は多少増加します。しかIPP 関数は 15% から 20% 程度です。ほとんどの場合、最適な結果

し、より効率良く実行される（アプリケーションがより短時間で完了を達成するには、より高いレベルのスレッド化を行うことが求められする）ため、最終的に作業を完了するまでの合計消費電力は少なくます。ライブラリーのプリミティブはスレッドセーフであるため、アプなります。つまり、SIMD 命令を使用することで、バッテリーの消耗をリケーションで直接スレッドを実装し、アプリケーション・スレッド内抑えながら、重要なワークロードのパフォーマンスを向上させることから直接パフォーマンス・プリミティブを呼び出すことができます。こができます。

のアプローチではスレッド管理がより良く行えるようになり、アプリ

インテリジェント・システムは、制限されたメモリーとストレージ

ケーションの要求に正確に適合するスレッド化が行えます（図 4）。

で動作しなければならないことがよくあります。そのため、動作中のアプリケーション・レベルでスレッド化する場合は、ライブラリー

ストレージデバイスやメモリーにおけるアプリケーションのフットプリにビルトインされているスレッド化を無効にすることを推奨します。

ント（合計バイナリーサイズ）を制御することが非常に重要です。ア

そうすることで、2 つのスレッド化モデル間のハードウェア・スレッ

プリケーションが利用可能なリソース内で実行できない場合、システ

ド・リソースの競合が排除され、利用可能なハードウェア・スレッド

ム全体の信頼性は大きく損なわれてしまいます。

に対するソフトウェア・スレッドのオーバーサブスクリプションを回避

インテル® IPP は、移植性とフットプリント管理のバランスが取れるように、柔軟なリンクモデルを提供します（表 1）。

できます。

コア 1

コア 2

コア 1

アプリケーション・スレッド

アプリケーション・スレッド

インテル® IPP を呼び出す

アプリケーション・スレッド 1

インテル® IPP
内部スレッドインテル® IPP がスレッド化を行う

インテル® IPP
内部スレッドインテル® IPP を
呼び出す

コア 2

アプリ
アプリケーション・スレッド 2
ケーションがスレッド化を行う
スレッドセーフな関数

インテル® IPP を呼び出す

インテル® IPP から
アプリケーションに戻る

インテル® IPP を呼び出す

インテル® IPP を呼び出す

アプリケーション・
スレッドの続きアプリケーション・
スレッドの続きアプリケーション・
スレッドの続き

電力

図 4: インテル® IPP を使用した関数レベルのスレッド化とアプリケーション・レベルのスレッド化

IPP-最適化済みアプリ

電力 = 作業実行の効率 (エネルギー供給)
消費エネルギー = 平均電力 * Δ 時間
アプリケーションの実行時間が速いとより早くアイドル状態に戻るため合計の消費エネルギーが少なくなる

非最適化アプリ時間
図 5: 最適化されたライブラリーを使用した場合の電力消費の違い
16インテル® ソフトウェア製品のパフォーマンスおよび最適化に関する注意事項については、http://software.intel.com/en-us/articles/optimization-notice/#opt-jp を参照してください。

PARALLEL UNIVERSE

スタンダード・ダイナミックとディスパッチ・スタティック・モデルは、インテル® IPP を含むアプリケーションをビルドするときに使用する最も単純なオプションです。スタンダード・ダイナミック・ライブラリーには、すべてのプロセッサーの最適化が含まれており、複数のインテル® IPP
ベースのアプリケーションでランタイムコードを共有できるという利点があります。ランタイム・プロセッサーの検出と適切な最適化レイヤーのディスパッチは自動的に行われます。

スタンダード・ダイナミック

カスタム・ダイナミック

ディスパッチ・スタティック 非ディスパッチ・スタティック

最適化

すべての SIMD セット

すべての SIMD セット

すべての SIMD セット

単一 SIMD セット

配布

実行ファイルとインテル® IPPの標準 DLL

実行ファイルとカスタム DLL

実行ファイルのみ

実行ファイルのみ

ライブラリーの更新

そのまま再配布

リビルドして再配布

カスタム・ライブラリーをリビル
アプリケーションを再コンパイル
ドし、アプリケーションを再コンして再配布
パイルして再配布

実行ファイルのサイズ

小さい

小さい

大きい

中くらい

合計バイナリーサイズ

大きい

中くらい

中くらい

小さい

カーネルモード

未サポート

未サポート

サポート

サポート

表 1: インテル® IPP のリンクモデルの比較

アプリケーションのソースコード

高水準コードのサンプル

インテル® IPP 機能のコードサンプル• サンプルビデオ/オーディオ/音声コーデック• 画像処理および画像圧縮• 信号処理およびストリング処理• データ圧縮および暗号化• .NET および Java* 言語統合

迅速なアプリケーション開発

API 呼び出しインテル® IPP ライブラリー C/C++ API

クロスプラットフォーム
API• データ圧縮• データ完全性• 信号処理• 行列演算• ベクトル演算• ストリング処理• 音声コーディング• 暗号化• 画像処理• 画像カラー変換• JPEG/JPEG2000/JPEGXR• コンピューター・ビジョン• ビデオエンコード/デコード• オーディオ・エンコード/デコード

互換性とコードの再利用

スタティック/ダイナミック・リンク
インテル® IPP のプロセッサー専用バイナリー

プロセッサー専用の実装• インテル® Atom™ プロセッサー• インテル® Core™ i7/i5/i3 プロセッサー• インテル® Core™2 Duo/Quad プロセッサー• インテル® Core™ Duo/Core™ Solo プロセッサー• インテル® Pentium® D デュアルコア・プロセッサー• インテル® Xeon® 64 ビット・デュアルコア・プロセッサー• インテル® Pentium® M/Pentium® 4 プロセッサー

優れた
パフォーマンス

図 6: インテル® IPP の概要。迅速に開発できるように多くのドメインにはサンプルのソースコードが用意されています。

17

PARALLEL UNIVERSE

アプリケーションで使用されているインテル® IPP 関数の数がインテル® IPP 関数実装のアトミックな特長（ロックやセマフォーが少なく、標準共有ライブラリー・オブジェクトが非常に大きい場ない）は、RTOS の決定的な環境で使用しても安全であることを意味し合、代わりにカスタム・ダイナミック・ライブラリーを使用します。

ます。RTOS にインテル® IPP ライブラリーを適用した例に、TenAsys 社

合計のバイナリー・フットプリントが最小になるように最適化するに（http://www.tenasys.com）の INtime* RTOS for Windows があります。

は、非ディスパッチ・スタティック・ライブラリーをリンクします。この場

INtime* RTOS は、Windows* ベースのプラットフォームでリアルタイム要合、ターゲット・プロセッサーで必要な最適化レイヤーのみを含む実件を制御する、Windows* と共存して実行できるように設計された OS

行ファイルが生成されます。このモデルは、1 つのプロセッサー・タイです。INtime* RTOS で使用されている ABI は、Windows* ABI と互換性

プと 1 つの SIMD 命令セットに最適化を制限することで、最小のフットがあり、Windows* 互換の関数呼び出し規約を利用しています。これら

プリントを実現します。1 つのプロセッサー・タイプで実行する、ライブの RTOS とインテル® IPP を組み合わせて使用することにより、DSP の特ラリーを含むアプリケーションを作成する場合は、このリンクモデル性であるディターミニズム（決定性）を兼ね備え、SIMD ベースのデータが最適です。カーネルモード（リング 0）やデバイスドライバーのアプを高スループットで処理できる環境を構築することができます。

リケーションにも、このリンクモデルの使用が推奨されます。

インテル® IPP は、パーソナル・コンピューター分野のネイティブ・ア

組 込みインテリジェント・システム用のエコシステムの開 発

プリケーション開発者だけでなく、アプリケーション・レイヤーとソフ

では、デスクトップやサーバーのオペレーティング・システムのトウェア間のインタラクションによってリアルタイム・システムの要件

ように、全体に目を配る必要はありません。SoC は、アプリケーを満たさなければならないインテリジェント・システム開発者のニー

ションとユーザー・インターフェイス・レイヤーに Yocto Project*

ズにも対応しています。インテル® IPP をミドルウェア、ドライバー、OS（http://www.yoctoproject.org）や Wind River* Linux*（http://

インタラクションの世界にも取り入れることで、リアルタイム要件と主www.windriver.com）をベースとしたカスタム組込み Linux* OS を

要な実行モデルを備えた組込みデバイスにも利用できます。OS ライ

使用して、チップセットのほかの部分をフェイルセーフなリアルタイ

ブラリーへの依存性がわずかで、柔軟なリンクモデルをサポートして

ム・オペレーティング・システム（FTOS や RTOS）で実行する場合もいるため、RTOS 特有の環境であっても、Poky-Linux* や MADDE* のあります。

ような GNU* ベースのクロスビルド環境であっても、組込みクロスビ

現在、インテル® IPP は、Microsoft* Windows*、Linux*、Mac OS* X、
QNX Neutrino*、Wind River* VxWorks* の 5 つのオペレーティング・
システムをサポートしています。

ルド環境に簡単に追加できます。
インテリジェント・システムとスモール・フォーム・ファクター・デバ
イス向けの開発では、ネイティブ開発を行えないことがよくあります。

QNX* および VxWorks* では、インテル® IPP のシングルスレッド・

インテル® IPP は、容易にクロスビルド環境に統合し、これらのリアル

スタティック・バージョンのみ利用できます。インテル® IPP のアプリ

タイムシステムの多くのフロー要件に適応した、クロスビルドのツール

ケーションを「サポートしていない」オペレーティング・システムで実チェーンとともに使用することができます。インテル® IPP を使用する

行するには、その OS が前述の 5 つのオペレーティング・システムでと、組込みインテリジェント・システムでインテル® SSSE3 ベクトル命令

定義されるアプリケーション・バイナリー・インターフェイス（ABI）とインテル® Atom™ プロセッサーの広いベクトルレジスターを利用できと互換性があり、メモリー割り当てルーチンが標準 C ライブラリー

るようになります。開発者は、複雑な SoC アーキテクチャーのアーキで使用できるか、特別な i_malloc インターフェイスを使用した関連

テクチャー間データ・ハンドシェイクによるリスクを増加させることなコードでマップできる必要があります。

く、ディターミニズムの要件を満たすこともできます。

ネイティブ

クロス

システム
ターゲット

ホスト

ホスト

アプリケーション

ミドルウェア

OS/RTOS/カーネル

アプリケーション
Angry Birds
4.99 USD

ドライバー• 開発ホスト = ターゲットシステム• 開発ホスト ≠ ターゲットシステム• メインストリーム PC アーキテク
チャーと Windows*/Linux*• 標準 PC アーキテクチャーなし、
小画面...

• 一般的な PC、オートメーション、
キオスク、その他• IVI、スマートフォン、
タブレット、
医療、組込みシステム（ブラックボックス）• OS/RTOS レイヤー、
カーネル開発、ハードウェアに近い開発• 専用のソフトウェア開発
ツールが必要• OEM、OSV、システム・インテグレーター、
組込み開発者• 動作する OS プラット
フォームと API を仮定• 標準開発ツール• モバイルアプリ開発者、Android* コミュニティー、
アプリストア、
Windows* および Linux*
開発者

図 7: インテル® IPP は、さまざまな開発状況とソフトウェアで利用することができます。

18

インテル® ソフトウェア製品のパフォーマンスおよび最適化に関する注意事項については、http://software.intel.com/en-us/articles/optimization-notice/#opt-jp を参照してください。

PARALLEL UNIVERSE

組込みスモール・フォーム・ファクター・デバイスの開発を行うこと
は、決定的な実行フロー要件を備えたアプリケーションを、システムのソフトウェア・レイヤーおよび OS（または RTOS）スケジューラーとより直接的に接続する必要があることも意味します。ソフトウェア開発ユーティリティーおよびライブラリーは、エンドユーザー・アプリ
ケーションであっても、特別なデータストリームや I/O インターフェイ
ス用のドライバーであっても、あらゆるソフトウェアで動作できるようにしなければなりません。インテル® IPP は、OS への依存性を最小限に抑え、さまざまなモードで動作する定義済みの ABI を備えています

BLOG
highlights（図 7）。アプリケーション・プロセッサー・アーキテクチャーとその長所（ハードウェア・プラットフォームを更新するたびに重要な関数を設計し直す必要がない）を活かしつつ、組込み信号処理およびマルチ
メディア処理用に高度に最適化された関数をさまざまなソフトウェアに適用できます。

インテル® Atom™ プロセッサーでインテル® IPP を利用する> インテル® IPP を購入するか、評価版をダウンロードします（http://
software.intel.com/en-us/articles/intel-ipp/）。
> インテル® IPP のコードサンプル（http://software.intel.com/en-us/
articles/intel-integrated-performance-primitives-code-samples/） を調べて、（実装済み、あるいは実装予定の）アルゴリズムのニーズに合うものがないか確認します。インテル® IPP のコードサンプルは、Windows*、Linux*、Mac OS* オペレーティング・システムで使用できます。各サンプルのビルド方法の説明は、各サンプルのメイン・ディ
レクトリーにあるサンプル別の ReadMe ファイルに記載されています。
一部のサンプルは、doc ディレクトリーにより詳細なドキュメント（通常は PDF ファイル形式）があります。
> ニーズに合うサンプルコードが見つからない場合は、リファレンス・マ
ニュアル（http://software.intel.com/sites/products/documentation/
hpc/composerxe/en-us/2011Update/ippxe/ipp_manual_lnx/index.
htm）を参照してみてください。マニュアルは、関数ドメイン別、ドメ
イン内の関数のクラス別に構成されています。インテル® IPP の関数
は約 12,000 あり、14 のドメインに分かれています（図 1）。
> 最後に、表 1 を参考にしてリンクオプションを選択します。これらの オ プ ション の 詳 細 は、http://software.intel.com/en-us/articles/
introduction-to-linking-with-intel-ipp-70-library/ を参照してください。

タスクベースの並列化モデルを使用するパフォーマンス上の利点
インテル コーポレーション
SHANNON CEPEDA
ソフトウェアのパフォーマンス向上の一環として、私はア
プリケーションへのスケーラブルな並列化の実装に関するサポートとコンサルティングを行っています。並列化の実装にはさまざまな理由があり、その手法もさまざまです。しかし、このブログではどちらについても触れません。
このブログでは、並列化を実装するある特定の手法のパフォーマンスの利点について述べます。幸い、その手法は複数のモデルによってサポートされています。
その手法とは、タスクベースの並列化です。つまり、特定のスレッドやプロセッサー・コアの代わりに、タスク（行われる作業）の点からアルゴリズムを設計することになります。現在タスクを使用する並列化モデルには、インテル®
TBB、インテル® Cilk™ Plus、Microsoft * Parallel Patterns
Library (PPL)、OpenMP* 3.0 などがあります。これらのタ
スクベースのライブラリーを使用することで、事前にコー
ディングされた関数、プラグマ、キーワード、テンプレートを使用して、アプリケーションを並列化できます...

この記事の続きはこちら（英語）でご覧になれます。

Go-Parallel.com（英語）でご覧になれます。
Go Parallel では、この他にも次のような関連トピックのブログをご覧いただけます : Translating Multicore Power
into Application Performance（マルチコアのパワーで
アプリケーション・パフォーマンスを引き出そう）。

19

ボトルネック

PARALLEL UNIVERSE

データ競合

無効なメモリーアクセス

メモリーエラー

スレッドエラー

メモリーリーク

20

インテル® ソフトウェア製品のパフォーマンスおよび最適化に関する注意事項については、http://software.intel.com/en-us/articles/optimization-notice/#opt-jp を参照してください。

データ競合PARALLEL UNIVERSE

初期化されていないメモリーへのアクセス

割り当ての不一致

メモリーエラー

ボトルネック.NET アプリケーションの信頼性とパフォーマンスを高めるツール.NET 開発者は、アプリケーションのパフォーマンスを向上させて、ハイパフォーマンス・
コンピューティングとエンタープライズ・アプリケーションで必要とされるコードの品質と信頼性を高めることができるようになりました。
インテル コーポレーション
ソフトウェア & サービスグループ

Levent Akyil、Asaf Yaffe

PARALLEL UNIVERSE

開発サイクルの初期にエラーを発見できる開発者フレン

インテル® Inspector XE のスレッド・アナライザーは、ネイティブ

ドリーなツールを利用する効果は絶大です。リリースした製品に不コードと同様の方法で、.NET プログラムの潜在的なデッドロックや具合が残されていると、製品の評価を大きく下げるだけでなく、修データ競合を検出します。インテル® Inspector XE は、ガベージコレ

正に多大な費用がかかります。アプリケーションのスレッドエラー

クトしたヒープおよびスタティック・データ領域のオブジェクト割り（データ競合およびデッドロック）やメモリーエラー（メモリーリー

当てと共有メモリーへのアクセスをモニターして、複数のスレッドにク）のように発見が困難なエラーを早期に検出できれば、より簡単

よる同一オブジェクト/クラスのデータメンバーへの非同期アクセスに修正することができます。信頼性やパフォーマンスをチェックする（少なくとも 1 つは書き込み操作）を潜在的なデータ競合としてフツールは、問題が含まれるソースコード行、イベントのコールスタッ

ラグ付けします。インテル® Inspector XE は、.NET 2.0 から .NET 3.5

クやタイムラインをビジュアルに表示し、ソフトウェアに含まれる問までのロック API によるデッドロックとロック階層違反を検出する

題について分かりやすく示すことで、開発者を支援します。インテル®

こともできます。

Parallel Studio XE を利用することで、.NET 開発者は、最も時間をインテル® VTune™ Amplifier XE は、近年のプロセッサーで最適な費やしている関数やコード行などの重要なパフォーマンスの問題、

パフォーマンスを発揮できるようにシリアル/並列アプリケーション

スケーラビリティーの問題、同期構造や I/O アクティビティーの待機のきめ細かな調整を支援します。また、.NET 開発者が純粋な .NET

時間を特定することができます。インテル® Parallel Studio XE は、分

アプリケーションや混合アプリケーションのパフォーマンス・ボトル

岐予測ミス、キャッシュミス、メモリー帯域幅の問題などによって引ネックを素早く検出できるようにします。インテル® VTune™ Amplifier

き起こされる潜在的なマイクロアーキテクチャーのボトルネックを

XE の hotspot 解析は、アプリケーションで最も実行時間を費やし発見します。

ている関数とソースの場所を特定します。コンカレンシー解析およこの記事では、インテル® Parallel Studio XE に含まれる 2 つのびロックと待機解析は、スレッド間の作業分配とスレッドの同期

ツール（エラー検出ツール インテル® Inspector XE とパフォーマン

ポイントをビジュアルに表示するため、並列実行の妨げとなっていス分析ツール インテル® VTune™ Amplifier XE）が .NET コード、ネイる作業分配の問題と過度なスレッド同期を開発者は識別すること

ティブコード、「混合」（.NET およびネイティブ）アプリケーションのができます。インテル® VTune™ Amplifier XE は、インテル® プロセッ

開発サイクルでどのように開発者に役立つか、例を挙げて説明しま

サーのパフォーマンス・モニタリング・ユニット（PMU）を使用してプす。インテル® Inspector XE とインテル® VTune™ Amplifier XE におロセッサー・イベントをサンプリングし、アーキテクチャーのボトル

ける現在の .NET のサポートについて言及した後、主な機能を C#

ネックを特定することで、開発者がマイクロアーキテクチャーのパ

アプリケーションで利用する方法を紹介します。

フォーマンスの問題を把握できるようにサポートします。

インテル® VTune™ Amplifier XE とインテル® Inspector XE における現在の .NET のサポート

インテル® VTune™ Amplifier XE とインテル® Inspector XE で .NET 解析を設定する

インテル® Inspector XE とインテル® VTune™ Amplifier XE は、純粋なユーザーは、解析する部分として、マネージド部分（「マネージド」.NET アプリケーションに加えて、マネージドコードとアンマネージド・モード）、ネイティブ部分（「ネイティブ」モード）、または両方（「混コードの両方を含む「混合」アプリケーションの解析をサポートして合」モード）を選択できます。これらのモードは以下のようにサポーいます。

トされています。
> ネイティブモードは、ネイティブコードのデータのみ収集し、マネージドコードのデータは収集しません。
> マネージドモードは、マネージドコードのデータのみ収集し、ネイティブコード
のデータは収集しません。
> 混合モードは、必要に応じてネイティブコードとマネージドコード両方のデータを収集します。このオプションは、ネイティブコードの呼び出しを行うマネージ
ド実行ファイルを解析するときに使用します。
> 自動モードは、ターゲット実行ファイルの種類を自動的に検出します。マネー
ジド・アプリケーションが検出されると混合モードに切り替え、ネイティブ・
アプリケーションが検出されるとネイティブモードに切り替えます。

図 1: Microsoft* Visual Studio* の .NET プロジェクト用のデバッグ・プロパティー

22

インテル® ソフトウェア製品のパフォーマンスおよび最適化に関する注意事項については、http://software.intel.com/en-us/articles/optimization-notice/#opt-jp を参照してください。

PARALLEL UNIVERSE

解 析モードの設定方法は、ツールの使用法によって異なります。コマンドラインからツールを使用する場合は、「-mr te-mode」
オプションでモードを指定します。Microsof t* Visual Studio* 内でツールを使用する場合は、アクティブなプロジェクト・タイプに基づいて解 析モードが自動的に選択されます。ネイティブ・プロジェクト（C /C++ アプリケーション）の場合、インテル® V Tune™
Amplifier XE とインテル® Inspector XE の解析モードはどちらも「ネイティブ」に設定されます。.NET プロジェクト（C# アプリケー
ション）の場合、インテル® VTune™ Amplifier XE のデフォルトの解析モードは「マネージド」に設定され、インテル® Inspector XEのデフォルトの解析モードは「混合」に設定されます。Visual Studio* の [Debug (デバッグ)] プロパティー・ページを使用して、異なるモードを選択することができます。.NET プロジェクトで「混合」解析モードを有効にするには、[unmanaged code debugging(アンマネージ コード デバッグを有効にする)] オプションをオンにします（図 1）。同様に、ネイティブ・プロジェクトで「混合」解析モードを有効にするには、[Debugger Type (デバッガーの種類)] を [Mixed (混合)] に設定します（図 2）。インテル® V Tune™
A m p l i f i e r XE またはインテル® I n s p e c to r XE のスタンドアロン・グラフィカル・インターフェイスを使 用する場 合は、[ P ro j e c t
Properties (プロジェクトのプロパティー)] ダイアログから解析モードを設定します（図 3 および 4）。

図 2:
Microsoft* Visual
Studio* のネイティブ・
プロジェクト用のデバッグ・プロパティー

図 3:インテル® VTune™
Amplifier XE のプロ
ジェクト・プロパティー

図 4:インテル® Inspector
XE のプロジェクト・
プロパティー23

PARALLEL UNIVERSE

namespace VTuneAmplifierXE.Examples{
public class POTENTIAL_MT{
		private static Thread[] threads = new Thread[Benchmarks.gThreadCount];		
private static workerThread[] workerThreads = new workerThread[Benchmarks.gThreadCount];		
private static object[] threadparams = new object[Benchmarks.gThreadCount];
		
		
		

// 信号の開始と完了
static AutoResetEvent[] goSignals = new AutoResetEvent[Benchmarks.gThreadCount];
static AutoResetEvent[] doneEvents = new AutoResetEvent[Benchmarks.gThreadCount];				public static double potential = 0.0;
public double potentialTotal = 0.0;

		public class workerThread		{			private volatile bool stopNow = false;			
private ThreadParameters threadParameters;			public void RequestStop()
			
{
				
stopNow = true;
			
}
			
private void computePot_mt(int tid)
			
{
				
int start, end;				
double distx, disty, distz, dist;
				
				

start = threadParameters.chunkBegin;
end = threadParameters.chunkEnd;

				potential = 0.0;				for (int i = start; i < end; i++)
				{
					
for (int j = 0; j < i - 1; j++)					{						
distx = Math.Pow((r[0][j] - r[0][i]), 2);						
disty = Math.Pow((r[1][j] - r[1][i]), 2);						
distz = Math.Pow((r[2][j] - r[2][i]), 2);						
dist = Math.Sqrt(distx + disty + distz);						
potential += 1.0 / dist;
					
}
				}
			
}
			 …
			
public void doWork(object parameter)
			
{
				
threadParameters = (ThreadParameters)parameter;				Console.WriteLine("Thread:{0} ready to start <{1} - {2}>",					
threadParameters.tid,					
threadParameters.chunkBegin,					threadParameters.chunkEnd);				
while (!stopNow)
				{
					
threadParameters.goSignal.WaitOne();					
computePot_mt(threadParameters.tid);					threadParameters.eventDone.Set();
				}
				
Console.WriteLine("worker thread: terminating gracefully.");			}		} // workerThread の最後…
} // POTENTIAL_MT の最後
図 5: 質点系の位置エネルギーを計算する C# プログラム

24

インテル® ソフトウェア製品のパフォーマンスおよび最適化に関する注意事項については、http://software.intel.com/en-us/articles/optimization-notice/#opt-jp を参照してください。

PARALLEL UNIVERSE

サンプルコードインテル® Inspector XE

インテル® Inspector XE とインテル® VTune™ Amplifier XE が .NET アプ

では、サンプルコードに対してインテル® Inspector XE を実行してみましょう。Visual Studio* の [ Tools (ツール)] メニューから、[Intel

リケーションをどのようにサポートしているかを示すため、ここでは、3 次元の距離に基づいて質点系の位置エネルギーを計算する C# プ
ログラムを使用します。このプログラムは .NET のスレッドプールを

Inspector XE 2011 (インテル® Inspector XE 2011)] > [New Analysis(新規解析)] を選択します（図 6）。[Configure Analysis Type (解析します。この記事では、C# スレッドや .NET フレームワークを使用しタイプの設定)] ページで、[Locate Deadlocks and Data Races (デッドロックとデータ競合の特定)] を選択し（図 7）、[Start (開始)] ボタ

たスレッド化の効率については説明しません。ハイパフォーマンスでンをクリックしてスレッド正当性解析を開始します。

使用してスレッド化されており、利用可能なコア数のスレッドを生成

スケーラブルな並列アプリケーションを開発する際に、各ツールがスレッド化の問題をどのように特定して開発に役立つかを説明します。

これを実行すると、データ競合があることが検出されます（図 8）。
[ Problems (問題)] ペインに個々の問題がリストされます。[Code

図 5 のコードは、各ワーカースレッドで実行されるアプリケー

Locations (コードの場所)] には、選択した問題と関連しているソー
スコードの場所が表示されます。[Filters (フィルター)] ペインを使用

は、スレッドの割り当て識別番号（tid）でインデックスされた境界

して、重要度、問題の種類、モジュール、ソースファイルで [Problems(問題)] ビューの表示をフィルタリングすることができます。

ションの部分を示しています。computePot メソッドで、各スレッドを用いて、計算する質点の開始（start）と終了（end）を決定します。各スレッドは、反復空間（start から end）を初期化した後、質点の位置エネルギーの計算を開始します。

図 6: Visual Studio* から新しいインテル® Inspector XE の解析を開始

問題をダブルクリックすると、[Sources (ソース)] ページ（図 9）に移動して、問題をより詳細に調査することができます。

図 7: インテル® Inspector XE の解析タイプの選択

図 8: インテル® Inspector XE 2011 で検出された潜在的なデータ競合

25

PARALLEL UNIVERSE

この ページでは 、共 有メモリー へ の 非 同 期アクセスを行う
典 型的な 2 つの実 行スレッドとその詳 細なコールスタックがメモリーチェッカーについて表示されます。表示内容を確認することで、スタティック・クラ

インテル® Inspector XE のメモリー・アナライザーは、.NET コードにス・メンバー "p ote nt ia l " へ 非同期アクセスが行われているか対応しており、
マネージドコードとネイティブコードを含む混合アプ

どうか、つまり、典 型的なデータ競合が 存 在するかどうかをす

リケーションのメモリーリークとメモリーエラーの検出に使用する

ぐに判 断することができます。ソース行をダブルクリックしてこともできます。メモリー解析はアプリケーションのネイティブ部分

直 接ソースコードにジャンプし、問題を修正できます。

に対して行われますが（ほとんどの検出可能なエラーは .NET コー

このデータ競合の最も単純なソリューションは、"p ot e nt ia l " ク

ドとは無関係であるため）、解析結果には、ネイティブコードのメモ

ラスメンバーへのアクセスがすべて、ロックで適切に同期されていリーエラーを引き起こした一連の .NET 呼び出しを含む、完全なスるかを確認することです。ただし、このソリューションでは並列コー

タックトレースが表示されます。

ドにシリアル領域（クリティカル・セクション）が追加されるため、インテル® Inspector XE が、.NET コードとネイティブコードが含まパフォーマンスに影響します。より優れたソリューションは、各スレッれる複雑なアプリケーションの正当性を解析できる、強力で貴重なドのローカル変数に potential のプライベート・コピーを格納し、結ツールなのは、スレッド化解析とメモリー解析機能の組み合わせに果を合計して最終的な値を計算することです。このソリューションでよるためです。

は依存性とスレッド間の同期が少なくなるため、並列コードの速度が向上します。

インテル® VTune™ Amplifier XE
正当性問題を修正したら、アプリケーションのパフォーマンスの解析を開始しましょう。図 10 は、Visual Studio* 内でコンカレンシー解析を開始する方法を示しています。第 2 世代インテル® Core™ プロ

セッサー・ファミリーのクアッドコア・プロセッサー（2.5GHz）でアプ
リケーションを解析した結果サマリーを 図 11 に示します。
図 9:
データ競合問題の詳細

図 10: Visual Studio* 内でインテル® VTune™ Amplifier XE のコンカレンシー解析を開始
26

インテル® ソフトウェア製品のパフォーマンスおよび最適化に関する注意事項については、http://software.intel.com/en-us/articles/optimization-notice/#opt-jp を参照してください。

PARALLEL UNIVERSE

スレッド・コンカレンシー・ヒストグラム
このヒストグラムは経過時間のブレークダウンを表します。特定の数のスレッドが同時に実行していたウォール
時間の割合が表示されます。
スレッドが CPU 上で実際に実行していた場合、または OS スケジューラーで実行可能な状態であった場合、スレッドは実行していたと見なされます。
スレッド・コンカレンシーは、本質的には待機していないスレッド数を測定するものです。
スレッドが実行可能な状態で CPU 時間を消費していない場合、スレッド・コンカレンシーは CPU 使用率よりも高くなります。

目標

平均

経過時間

3s

0s
0

1

Idle

2

Poor

3

4

OK

Ideal

5

6+

Over

同時に実行しているスレッド数

CPU 使用率ヒストグラム
このヒストグラムは経過時間のブレークダウンを表します。特定の数の CPU が同時に実行していたウォール時間の割合が表示されます。
スレッドが論理 CPU 上でコードを実行している場合、CPU 使用率はスレッド・コンカ
レンシーよりも高くなります。

目標

平均

経過時間

5s

0s
0

Idle

1

2

Poor

3

4

OK

Ideal

同時に実行しているスレッド数

図 11: 解析のスレッド・コンカレンシー・ヒストグラムと CPU 使用率ヒストグラム

27

PARALLEL UNIVERSE

図 12: [ Hotspots by Thread Concurrency (スレッド別 hotspot コンカレンシー)] ビュー

図 11 は、アプリケーションが利用可能なすべてのコアを十分に活用していないことを示しています。
[Bottom-up (ボトムアップ)] ビュー（図 12）で詳細な結果を確認します。workerThread:: computePot_mt
メソッドが CPU 時間のほとんどを費やしていて、その多くの時間の CPU 使用率が Poor（赤）およびOk（オレンジ）になっていることが分かります。
これは、特にこのメソッドが hotspot（つまり、CPU 時間のほとんどを費やしている）であり、スレッ
ド化されているにもかかわらず利用可能なコアをほとんど使用していないことを示します。問題を特定するため、タイムラインを拡大して、このメソッドを実行しているスレッドを調べます。図 13 から、
workerThread::computePot_mt メソッドを実行する 4 つのスレッドが費やしている CPU 時間が異なっているために、ロード・インバランスが発生し、コアが効率的に利用されていないことが分かります。ロード・インバランスが発生していると、より多くのコアでアプリケーションを実行したときに適切にスケーリングされないため、修正しておく必要があります。
外側の for ループの実行回数はすべてのスレッドで同じですが、内側のループの実行回数は最後のチャンクを実行するスレッドのほうが多くなり、最初のチャンクを実行するスレッドのほうが少なくなります。スレッドカウントによって反復の循環オフセットを分配することで、ロード・インバランスが修正され、各スレッドは利用可能なコアをより適切に利用するようになります。コンカレンシー解析とその結果は、
ロード・インバランスの問題を特定できるだけでなく、アプリケーションのスピードアップにも役立ちます。図 15 のようにコードを変更することで、ロード・インバランスが解消され、すべてのスレッドが効率的に実行されるようになりました（図 16）。

「ロード・インバランスが発生していると、より多くのコアでアプリケーションを実行したときに適切にスケーリングされないため、修正しておく必要があります。」

28

インテル® ソフトウェア製品のパフォーマンスおよび最適化に関する注意事項については、http://software.intel.com/en-us/articles/optimization-notice/#opt-jp を参照してください。

PARALLEL UNIVERSE

図 13: タイムライン上のスレッドのロード・インバランスと各実行スレッドの CPU 時間を表示

スレッド 1（範囲）スレッド 2（範囲）スレッド 3（範囲）スレッド 4（範囲）

0 -249250 – 499

500 – 749

750 - 999

0,4,8,…,992, 996

1,5,9,..,993,997

2,6,10,…,994,998

3,7,11,…,995,999

オリジナルバージョン
変更後

図 14: 4 スレッドにおける反復の循環

オリジナルバージョン

ロードバランスを含むバージョン

chunkBegin = tid * (nParts / threadCount);
chunkEnd = (tid + 1) * (nParts / threadCount);…
start = threadParameters.chunkBegin;
end = threadParameters.chunkEnd;
for (int i = start; i < end; i++){for (int j = 0; j < i - 1; j++){distx = Math.Pow((r[0][j] - r[0][i]), 2);
disty = Math.Pow((r[1][j] - r[1][i]), 2);distz = Math.Pow((r[2][j] - r[2][i]), 2);dist = Math.Sqrt(distx + disty + distz);
potential += 1.0 / dist;}}for (int i = tid; i < constants.POT_NPARTS; i +=threadParameters.threadCount){for (int j = 0; j < i - 1; j++){distx = Math.Pow((r[0][j] - r[0][i]), 2);
disty = Math.Pow((r[1][j] - r[1][i]), 2);distz = Math.Pow((r[2][j] - r[2][i]), 2);dist = Math.Sqrt(distx + disty + distz);
potential += 1.0 / dist;}}

図 15: スレッドカウントによるロード・インバランスの改善

29

PARALLEL UNIVERSE

図 16: 作業がほぼ均等に分割された 4 つのスレッドで workerThread::computePot_mt メソッドが実行されている

これでコードの修正は完了でしょうか。いいえ、まだ続きがあり

ドの CPI 値が大きくなるほど、コードをチューニングしてパフォーマ

ます。インテル® VTune™ Amplifier XE のアーキテクチャー解析を実行して、さらなるパフォーマンス向上の可能性を探ってみます。

ンスを向上できる可能性がより高いことを意味します。図 18 は、[General Exploration (全般解析)] の結果を示しています。結果を見ここでは、第 2 世代インテル® Core™ マイクロアーキテクチャー用に事前定義されている「General Exploration (全般解析)」を使用

ると、Math.Pow() 関数の呼び出しに大量のクロック数が費やされていることが分かります。図 19 のように Math.Pow() を単純な乗算に置換することで、パフォーマンスが向上し、CPI レートは 1.5 にします。
第 2 世代インテル® Core™ マイクロアーキテクチャーは、理想的減りました。

な状態では CPI が 0.25 まで低くなります。指定されたワークロー

図 17: インテル® VTune™ Amplifier XE の [General Exploration (全般解析)] を実行

30

インテル® ソフトウェア製品のパフォーマンスおよび最適化に関する注意事項については、http://software.intel.com/en-us/articles/optimization-notice/#opt-jp を参照してください。

PARALLEL UNIVERSE

図 18: [General Exploration (全般解析)] の結果 - 問題が潜む関数が強調表示されている

for (int i = tid; i < constants.POT_NPARTS; i +=threadParameters.threadCount){for (int j = 0; j < i - 1; j++){distx = Math.Pow((r[0][j] - r[0][i]), 2);
disty = Math.Pow((r[1][j] - r[1][i]), 2);distz = Math.Pow((r[2][j] - r[2][i]), 2);dist = Math.Sqrt(distx + disty + distz);
potential += 1.0 / dist;}}for (int i = tid; i < constants.POT_NPARTS; i +=threadParameters.threadCount){for (int j = 0; j < i - 1; j++){distx = (r[0][j] - r[0][i]) * (r[0][j] - r[0][i]);disty = (r[1][j] - r[1][i]) * (r[1][j] - r[1][i]);distz = (r[2][j] - r[2][i]) * (r[2][j] - r[2][i]);dist = Math.Sqrt(distx + disty + distz);
potential += 1.0 / dist;}}

図 19: Math.Pow() の置換

オリジナルバージョン（秒）ロード・インバランス修正後（秒）Math.Pow()置換後（秒）

5.4

4.65

0.39

図 20: 実行時間の比較「インテル® Parallel Studio XE を利用することで、.NET
開発者は、最も時間を費やしている関数やコード行などの重要なパフォーマンスの問題、スケーラビリティーの問題、同期構造や I/O アクティビティーの待機時間を特定することができます。インテル® Parallel Studio XE は、
分岐予測ミス、キャッシュミス、メモリー帯域幅問題などによって引き起こされる潜在的なマイクロアーキテク
チャーのボトルネックを発見します。」

31

PARALLEL UNIVERSE

高度で詳細なマイクロアーキテクチャー解析を行えるように、

パフォーマンス ・
チューニングの評価基準

ツールには定義済みの解析タイプが用意されています。パフォー
マンス・モニタリング・ユニット（PMU）を使用してプロセッサー・イ
ベントをサンプリングすることで、キャッシュミス、ストールサイク
ル、分岐予測ミス、その他のマイクロアーキテクチャーの問題を特定します。高度な解析タイプは、インテル® Core™2 マイクロアーキテ

リタイアした命令あたりのクロック数（CPI）は、各命令のクチャー、インテル® Core™ マイクロアーキテクチャー（開発コード

実行にかかったおおよその時間を示す基本的なパフォー

名: Nehalem および Westmere）、第 2 世代インテル® Core™ マイク

マンスの評価基準です（単位はクロック数）。最近のスー

ロアーキテクチャー（開発コード名: Sandy Bridge）などのプロセッ

パースカラー・プロセッサーは、1 サイクルあたり 4 つま

サー・アーキテクチャー向けに定義されています。これらの解析タイでの命令を発行できるため、理論的な最良の CPI 値はプを使用すると、ツールは問題の関数をハイライトしてヒントとアド

0.25 になります。さまざまな要因（大きなレイテンシー

バイスを表示します。

のメモリー、浮動小数点演算、SIMD 演算、分岐予測ミスによりリタイアしない命令、フロントエンドの命令スタ
ベーションなど）により、測定される CPI の値は高くなる

サポートされている .NET のバージョン

傾向にありますが、アプリケーションのパフォーマンス・インテル® VTune™ Amplifier XE とインテル® Inspector XE は、.NET

チューニングの全体的な可能性を判断する優れた測定基バージョン 2.0 から 3.5 で利用可能な基本的な同期メカニズムを準として広く用いられています。

サポートします。.NET 4.0 で採用された新しい同期 API や新しいタ
スク並列ライブラリ（TPL）はサポートしていません。

まとめ
エラー検出ツール インテル® Inspector XE とパフォーマンス分析
ツール インテル® VTune™ Amplifier XE は、.NET 開発者にとって貴重なテクノロジーを提供します。インテル® Parallel Studio XE に含まれるこれらのツールを利用することで、アプリケーションのパフォー
マンスを向上し、ハイパフォーマンス・コンピューティングとエンター
プライズ・アプリケーションで必要とされるコードの品質と信頼性を高めることができます。このスイートには、パフォーマンス向上のために必要なすべてのツールが備わっており、将来のマルチコア・プロ
セッサーからメニーコア・プロセッサーへの移行も容易に行えます。
ソースコードのダウンロード ›32

インテル® ソフトウェア製品のパフォーマンスおよび最適化に関する注意事項については、http://software.intel.com/en-us/articles/optimization-notice/#opt-jp を参照してください。

PARALLEL UNIVERSE

最適化に関する注意事項
インテル® コンパイラーは、互 換マイクロプロセッサー向けには、インテル製マイクロプロセッサー向けと同等レベルの最適化が行われない可能性があります。これには、インテル® ストリーミング SIMD 拡張命令 2（インテル®
SSE2）、インテル® ストリーミング SIMD 拡張命令 3（インテル® SSE3）、ストリーミング SIMD 拡張命令 3 補足命令
（SSSE3）命令セットに関連する最適化およびその他の最適化が含まれます。インテルでは、インテル製ではないマ
イクロプロセッサーに対して、最適化の提供、機能、効果を保証していません。本製品のマイクロプロセッサー固有の最適化は、インテル製マイクロプロセッサーでの使用を目的としています。インテル® マイクロアーキテクチャーに非固有の特定の最適化は、インテル製マイクロプロセッサー向けに予約されています。この注意事項で対象としている特定の命令セットに関する詳細は、該当製品のユーザーズガイドまたはリファレンス・ガイドを参照してください。
改訂 #20110804

33

インテル® ソフトウェア製品のパフォーマンスおよび最適化に関する注意事項については、http://software.intel.com/en-us/articles/optimization-notice/#opt-jp を参照してください。

パフォーマンスを極限まで高める
インテル® Parallel Studio XE

インテル® Parallel Studio XE 2011 は、個人ユーザーから数千人規模の大企業まで、あらゆる開発者に、かつてないアプリケーション・パフォーマンスと信頼性を提供する業界最高レベルの総合開発ツールです。下記の製品が含まれています。

高度な C/C++、Fortran
コンパイラーとライブラリーインテル® Composer XE

高度なスレッド / メモリー
エラー検出、セキュリ
ティー分析ツール
インテル® Inspector XE

高度なパフォーマンス
分析ツール

インテル® VTune™ Amplifier XE

インテル® Parallel Studio XE の評価版は、www.intel.com/software/products（英語）から
ダウンロードできます。製品情報および購入情報は、インテル® ソフトウェア開発製品 Web サイトを参照してください。
http://www.intel.com/jp/software/products/
インテル® ソフトウェア製品のパフォーマンスおよび最適化に関する注意事項については、http://software.intel.com/en-us/articles/optimization-notice/#opt-jp を参照してください。
Ⓒ 2012 Intel Corporation. 無断での引用、転載を禁じます。Intel、インテル、Intel ロゴ、Cilk、Intel Atom、Intel Core、Pentium、Xeon、VTune は、アメリカ合衆国および / またはその他の国における Intel
Corporation の商標です。* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。