最 新 開 発 環 境 レ ポ ート

最新のマルチコアプロセッサ向け最適化もサポートした

インテル C＋＋ コンパイラ9
特

別

記

事

Vtuneで最適化を生かす

最適化コンパイラの効率的なパフォーマンス向上

本誌掲載の記事はソフトバンククリエイティブ株式会社
C MAGAZINE 2005年8月号・10月号に掲載されたものです
CopyrightÂ2005 SOFTBANK Creative Corp.

最新のマルチコアプロセッサ向け最適化もサポートした

インテルC++コンパイラ 9

能は、今後のバージョンで対応する予定です。）

ICC 9がサポートする主なプロセッサ

インテルC++コンパイラ9は、既存のインテルプロセッサに加えて、最新のマルチコアプロセッサもサポートしています。
ここでは、製品情報の紹介にとどまらず、マルチコアプロセッサ環境ではどのくらいパフォーマンスが向上するのかを検証します。

のWindows XPやWindows Server 2003以降で実行したとき予期せぬエラーが発生する
おそれがあります。

ターゲット（アプリケーションを実行する
システム）の組み合わせがあります。たとICC 9をインストールするには、Admini

ルプレミアサポートのFile Downloadsセク

stratorsグループに所属しているアカウント

トしており、とくにこれらのプロセッサ向ションを確認してください。CD-ROMやダを使用する必要がありますが、VC++ .NETけに最適化されています。

ウンロードライセンスに含まれているもののIDEやコマンドラインから利用するだけ

新しい機能や改良された機能
ICC 9にはいくつもの新機能や、これま

インテルの新しいC++コンパイラである

えば、IA-32システム環境ではすべてのター

インテルC++コンパイラ 9（以下、ICC 9）は、ゲットをビルドできますが、EM64T対応シアプリケーションのコードサイズを減らし、ステムの環境ではIA-32システムやItanium

Windows版のICC 9は、Visual C++（以下、

これまでのものとのもっとも大きな違い

インテルアーキテクチャのプロセッサ上でベースシステムのターゲットをビルドできVC++）のリンカを使用するため、コンパイ

は、最新のマルチコアプロセッサへのサポの実行速度を向上できます。デベロッパがません。サポートされているホストとターラを使用するには以下のいずれかの製品がートです。

主に利用している開発環境との互換性も非ゲットの組み合わせをTable 1に、また各ホ必須となります。

常に高く、簡単に利用できるのが特徴の1ストで必要なシステム構成をTable 2に示し

・Visual Studio（VC++）6.0のプロフェッシ

つです。

ます。開発の目安にしてください［注1］。
［注1］
ICC 8.1.015より前のバージョンとBuild 3790.1289より前のMicrosoft Platform SD
Kを使用してEM64T用にコンパイルされた
コードは、ICC 9.0とBuild 3790.1289以降のPlatform SDKを使用して再コンパイルする必要があります。これは、マイクロソフト
によって行われたWindowsの呼び出し規則
における互換性の変更による問題です。
再コンパイルを行わないと、64ビット版

また、Windows版のICC 9は最新のマルチコアプロセッサ環境に対応し、インテル
エクステンデッドメモリ64テクノロジ（以下、EM64T）のアプリケーション開発にも対応しています。

動作環境
Windows版のICC 9は、使用する環境に応じて該当するハードウェアやソフトウェ
アの動作環境が必要になります。
開発には、サポートされているホスト（ア

Table 2

Table 1
ホスト

ホストとターゲットの組み合わせターゲット
IA-32システム

IA-32システム
EM64T対応システム
Itaniumベースシステム

でのバージョンに対する改良が行われてい必要なソフトウェア

ます（Fig. 2）。

ョナルまたはエンタープライズエディシ
ョン・Visual Studio（VC++）.NET 2002か2003のスタンダードエディション以上

なら「Users」または「Debugger Users」グルあります［注2］。

ープに所属していれば大丈夫です。

ただし、インテルプレミアサポートから

EM64TシステムまたはItaniumベースシ

コンパイラをダウンロードするには、最初ステム向けのアプリケーションを開発するに製品を登録しておく必要があります。

場合は、コンパイラをインストールする前［注2］
ICC 9より前のバージョン（8.1以前）を使用している場合は、そのバージョンをインストールする前にアンインストールする
必要は基本的にありません。ただし、VC++.NETとの統合とArray Visualizerだけは削除してください。
開発中、もし必要なコンポーネントをアッ
プグレード（またはダウングレード）したくなった場合は、アプリケーションの追加と削除から、インストールされているICC 9の「Modify（変更）」を選択することで簡単ににホストにPlatform SDKをインストールしておく必要があります。
ホストがIA-32の場合、推奨するインスト
ールの手順をまとめると、以下のとおりになります。
①VSかVC++をインストール②ItaniumベースシステムまたはEM64Tシ

ると、インテルプレミアサポートと呼ばれFig. 1 ICC 9が最適化されているプロセッサる1年間のサポートサービスを受けること・インテルマルチコアプロセッサ・インテルPentium 4プロセッサ・インテルCentrinoモバイルテクノロジを構成するインテルPentium Mプロセッサ・インテルItanium 2プロセッサ・インテルXeonプロセッサができます。
インテルプレミアサポートは、ソフトウ
ェアのエキスパートによる技術サポートやン機能のみになります。IDEへの統合機

製品アップデート、サンプルコード、各種
技術ドキュメントなどを入手できます。

EM64T対応システム

Itaniumベースシステム

○

○

×

○

×

×

×

○

インストールアプリケーションの開発に必要なシステム構成

ここで、Windows版のICC 9をベースに、に触れておきます。詳しくは製品に含まれ開発に必要なシステム（推奨するシステム）

必要なメモリ容量（推奨値）

ディスク容量特別なソフトウェア環境

ホスト：IA-32
ターゲット：IA-32

Pentium À450MHz以上のIA-32（Pentium 4またはAMD Athlon）（512MB）
256MB

100MB

―

ホスト
：IA-32
ターゲット：IA-64

Pentium À 450MHz以上のIA-32（Pentium 4またはAMD Athlon）（512MB）
256MB

150MB

Microsoft Platform SDK

ホスト：IA-32
ターゲット：EM64T/AMD64

Pentium À 450MHz以上のIA-32（Pentium 4またはAMD Athlon）

ホスト：EM64T/AMD64
ターゲット：EM64T/AMD64

64ビット対応のPentium 4
またはAMD Athlon 64ているインストールガイドを参照してくだ

価 格
サポート

Microsoft Platform SDK

300MB

Microsoft Platform SDK（Build 1289以降）

新しい機能および改良された機能

問い合わせ先・既存のインテルプロセッサに加えて、インテルマルチコアプロセッサをサポート。高度な最適化機能
によって、最新のインテルプロセッサ上で実行するアプリケーションで優れたパフォーマンスを実現
・バッファオーバーラン問題に対応するセキュリティ機能として、スタックフレームのランタイムエラ
ーチェック機能を追加
・IA-32プロセッサ、インテルItaniumプロセッサ、インテルEM64T対応のプロセッサ用のツールを1つのパッケージにまとめた

さい。

Table 3 ICC 9の製品概要

100MB

Fig. 2［新機能］

インストール方法と設定方法について簡単

（1GB）
512MB

よりも新しいバージョンが存在することがインテルソフトウェア開発製品を購入す以上（2006年3月時点では、コマンドライ

ホストとターゲット

2

安心のサポート・Visual Studio 2005スタンダード版かそれ

○

（1GB）
512MB

インストールの準備ージョンやアップデートがないか、インテ

プロセッサであれば問題なく動作します。
プリケーションをビルドするシステム）と、最初に、入手したICC 9よりも新しいバ

ICC 9はFig. 1に示すプロセッサをサポー

もちろん、これら以外でも互換性のある

インテルC++コンパイラ概要

対応できます。

まずはアップデートの確認から

64,260円（Windows版、Linux版）
購入日より1年間有効
エクセルソフト株式会社
メール：intel@xlsoft.com
Web：http://www.xlsoft.co.jp/jp/
products/intel/［改良］・最新のインテルXeonプロセッサ用のコンパイラを引き続き提供
・最適化コードをサポートする改良されたインテルデバッガを提供
・登録を含むインストール作業を簡素化

最新開発環境レポート インテルC++コンパイラ 93

ステム用のアプリケーションを開発す

使用できますがアップデートはできません。

る場合はPlatform SDKをインストール

次に「Tool Selection」が表示されます（Fig.

③ICC 8.xのVC++との統合を削除

5）。Tool Selectionには、インストール可能④ICC 9をインストールなコンポーネントの説明とボタンが表示さ

ICC 9は、以前のバージョンのICCがインれています。

2002/2003 IDEなどから使用できます。
IDEに対しては、セットアップ時に基本的な環境設定を行っています。

とによってオーバーヘッドを減らします。

上する可能性があります。

め、アプリケーションがよく使用するような入力データを使うことが重要です。コン

またエイリアス分析を改善してコードのベ
クトル化とループ変形を行います。さらに、・プロファイルに基づく最適化（PGO）

パイラは各実行ごとに動的な情報ファイル

コマンドラインからICC 9をもっとも簡限定的ではありますが、データレイアウト

プロファイルによりコードのレイアウト

単に使用するには、［スタート］→［プログの最適化を行ってキャッシュの使用効率もを最適化するとともにコードサイズも減ら改善します。

します。分岐予測ミスが少なくなるため命最後のフェーズでフィードバックコンパ

を生成し、それぞれのコードセクションが実行される頻度を記録します。

ストールされている場合でも同時インスト

インストールするコンポーネントの Insta

ラ ム ］→［ Intel（ R）Software Developmentールは可能ですが、Visual C++ .NET開発環ll ボタンをクリックすると、そのコンポー

Tools］→［ Intel（ R） C++ Compiler 9］→

IPOは2つのフェーズによって自動的に実令キャッシュのスラッシングが減り、アプ

イルを行います。/Qprof̲useオプションを境に統合できるのは1つのみとなります。

ネントのインストーラが開始します。コン［Build Environment for IA-32 applications］

行されるしくみになっています。まず最初

リケーションのパフォーマンスが向上しま

つけることで、実行パスのデータがアプリ

64ビット環境の構築および開発方法につポーネントによってはカスタムセットアッを選択してコマンドを開きます。

のフェーズでIPOがコードを解析し、ソーす。

ケーションの再コンパイルにフィードバッ

いては、本誌2005年6月号の62ページ「AMプができるものもあり、さらに必要なもの

D64とEM64T」をご覧ください。

だけをインストールできます（Fig. 6）。

もし、64ビット拡張に対応したアプリケ

スコードの中間オブジェクトと最適化用のPGOは主に命令キャッシュの使用効率をーションを作成したい場合は、同じメニュ

サマリ情報が含まれた情報ファイルを生成改善します。頻繁にアクセスされるコード

プロファイルサマリファイルに組み込まれ1つのインストールが完了すると再びToolーの最後で［Build Environment for EM64T

します。

セグメントを互いに隣接した場所に移して、ます。

Selection画面に戻るので、必要なコンポー

applications］を選択します。このようにし

そして次のフェーズで、その時点で有効

アクセス頻度の低いコードはモジュールのコンパイラはこのサマリファイルを使用

まず、ICC 9のセットアップファイルを実

ネントをインストールしていきます。そうて開いたコマンドラインには、それぞれのな情報ファイルを持つすべてのモジュール

後方に移動します。これにより分岐の一部

して、最終的なアプリケーション内でもっ行します。
「 Intel Software Setup Assistant」が表示されるので、 Next > ボタンをクリして必要なコンポーネントをすべてインストールしたら Next > ボタンをクリックし開発環境変数が自動的に設定されていまに対してコンパイラが関数のインライン化を削除し、コードサイズも小さくなってプとも頻繁に使用されるパスの最適化を行うす。

を行います。

ロセッサ命令のフェッチ効率が向上します。

しくみです。

ックします（Fig. 3）。するとシリアル番号をます。

クされます。これによって情報ファイルがひんぱん

インストール手順

ひんぱん

入力する画面が表示されます（Fig. 4）。

PGOは3つのフェーズによって手動で操

次は、インテルプレミアサポートの登録

もし、ライセンスファイルを持っているを行う画面になります。登録する場合はメ

場合は、そちらを利用するのがおすすめでールアドレスを入力して、登録しない場合
はチェックボックスをオフにして、 Next >ボタンをクリックします。

すが、持っていなければシリアル番号を入力して Next > ボタンをクリックします。

ICCの主な機能と特徴

コンパイラのコードカバレッジツールは、

ICC 9は、最適なパフォーマンスを引きり効率的に使用して、メモリレイテンシー

す。/Qprof̲genオプションを使用すること

開発効率を改善しエラーを減らしてアプリ出すための機能や高い互換性を持っていまを減らし、プログラムが必要とする前にデで、コンパイラはソースコードからインス

ケーションのパフォーマンス向上を支援しす。高度な最適化機能によって、最新のイータをプリフェッチするなどしてアプリケ

ツルメント化されたプログラムを作成できます。

ーションの処理速度を改善します。

ます。

ンテルプロセッサ上で実行するアプリケー

up AssistantはインテルのWebサイトに接続をクリックして、インストール完了となりションで優れたパフォーマンスを示します。

してライセンスを取得し、PCにインストーます。

トールされます。この場合、コンパイラはFig. 3 Intel Software Setup Assistant画面

4

パフォーマンス

コンパイラ環境の設定

・プロシージャ間の最適化（IPO）

ICC 9は、コマンドラインやVC++.NET

Fig. 4・コードカバレッジツール

ツルメント化されたプログラムを作成しま

そのあとは、最終画面で Finish ボタン

い場合、デフォルトのライセンスがインス作します。まず、最初のフェーズでインス

命令ページング/キャッシュメモリをよインターネットに接続している場合、Set

ルします。インターネットに接続していな・キャッシュの最適化

分岐やジャンプ、コール数を削減するこ

シリアル番号入力画面

・SSE3のサポート

プリフェッチは、/O3オプションや/Qpre

次のフェーズでは、インスツルメント化

fetchオプションを使うとアプリケーションされたプログラムを実行します。インスツ

ストリーミングSIMD拡張命令3とプロセ

内の適所に挿入されます。一定のパターン

ルメント化されたプログラムは、典型的な

ッサディスパッチをサポートし、SSE3が利に基づいてメモリにアクセスするようなア

入力データに対して実行します。入力デー

用できる環境下で効果的な並列処理を可能

プリケーションでは、処理速度が大幅に向タが異なれば当然最適化の結果も異なるたにします。

Fig. 5 Tool Selection画面

Fig. 6

カスタムセットアップ画面

最新開発環境レポート インテルC++コンパイラ 95

・自動ベクトル化機能

スペキュレーションとは、Itaniumプロセ

IA-32プロセッサ用のインテルコンパイラ

ッサの機能の1つで、アセンブリ言語の開には、コードを自動的に並列化してプロセ

発またはコンパイル時に行う予測に基づいッサの能力を最大限に引き出すための自動て、たとえば負荷の大きい命令などをプロベクトル化機能が用意されています。

グラムの実行順に関係なくあらかじめ実行

これは、同一命令によって連続したデー
タアクセスのパターンをコンパイラが検出しておいて処理速度を改善するといった機能です。

掲載するにはボリューム的に難しいので、のWindows XP x64 Editionを使った環境でが行わなくても並列化が可能です。

全コンパイラスイッチについては、本誌付行います。このPentium Dは、1つのダイに

今回は、アプリケーションをシングルス

録CD-ROMに収録されているヘルプファイ

2つのプロセッサコアを持ち、さらにハイレッド版とマルチスレッド版の2種類、さル（Intel compiler switches.chm）を参照して

パースレッディング（物理的なプロセッサ

らに32ビット版と64ビット版の2種類+コン

いただくとして、ここでは今回のICC 9での実行リソースを内部に2つ持つことで、論

パイルオプション別にいくつかのバイナリ

追加あるいは削除されたスイッチのみをリ

理的に2つのプロセッサとして見せかけるを作ってテストしてみました。

スト化しておきます（Table 4〜6）。

技術）があるので、論理プロセッサの数は、シングルスレッド版とマルチスレッド版

OSやアプリケーションからトータルで4つを比較することでコンパイラの最適化度合

互換性
・規格準拠
ANSI C/C++およびISO C/C++規格に準拠したソフトウェアを開発できます。

してSIMD処理に合わせてコードを変形す

ここで、コンパイラスイッチに関して、・OpenMPのサポート

るしくみです。
・64ビット拡張のサポート
インテルEM64Tのサポートによって、最あります。それは、一部の最適化オプショ

能によるマルチスレッドアプリケーション.NET 2002/2003とオブジェクト、ネイティ

ンには、アプリケーションを実行するプロをサポートしています。

ブコードの互換性があります。

セッサの種類に制限があるという点です。

・IDEの互換性

実行するには、Windows NT4.0（SP6）/2000

OpenMPは、ループレベルまたは関数レとができます。ICC 9では、OpenMP APIの・分岐の排除VS（VC++）環境に統合して簡単にアプリ

Ver. 2.0をサポートしています。

ケーションを開発できます。

・自動並列化機能

・デバッガ

ICC 9には、自動並列化という機能があります（/Qparallelスイッチ）。この機能によくなり分岐予測ミスによるペナルティも排り、マルチプロセッサシステムやハイパー除されるため、アプリケーションのパフォ

スレッディングテクノロジ対応システム上ーマンスが向上します。

でのアプリケーションパフォーマンス改善を手軽に実現できます。

・強化されたItanium 2のコード生成

Sが必要となります。Windows 9x系では、

インテルデバッガをサポートしています。

ICC 9のコンパイラスイッチ一覧
ICC 9にはさまざまなコンパイラスイッチが用意されています。

るループを検出し、これらのループに関し

時代の流れとともにどうしても必要になっウェアのパイプライン化を使用してItaniumてマルチスレッドコードを自動的に生成してくるスイッチや、不必要なスイッチなど

2用のコードを生成します。

ます。スレッドのスケジューリングや同期も出てきます。誌面にすべてのスイッチをる機械語命令が、特定のOSやプロセッサでサポートされているかどうかはアプリケー

内 容
浮動小数点モデルのバリエーションを決定する
double ：中間結果に64ビットの精度を用いて計算する
except［-］：コードの生成中に浮動小数点の例外を考慮する
extended ：中間結果に80ビットの精度を用いて計算する
fast：結果の予測は困難だが最速で計算する
precise ：結果の予測が可能な範囲で計算する
source ：入力元の精度を中間結果として使用する
strict：/fp:preciseと/fp:exceptを有効にして浮動小数の乗加算命令を無効にする
外部グローバル変数を安全にロードする［しない］
マッピングツール（WindowsコンパイラオプションをLinuxシステム環境で扱えるようにする）を有効にする
マルチバイトキャラクタのサポートを有効［無効］にする
最適化された平方根を有効［無効］にする
サンプリングツールを使うためのコードマップ情報を準備する
プリフェッチヘルパースレッドを生成できるようソフトウェアベースであらかじめ計算する
未初期化データをトラップする
小さい型への変換をチェックする
スタックフレームのラインタイムタイプチェックを有効にする
初期化されなかった変数を報告する

コンパイラの検証
テストプログラムにみるコンパイラ性能
今回新しくリリースされたICC 9は、新Table 4 ICC 9で新しく追加されたコンパイルスイッチ

6

つまり、アプリケーションで使用していインテルのコンパイラスイッチは基本的分岐予測やスペキュレーション、ソフト/Qglobal-hoist［-］/Qmap-opts/Qmultibyte-chars［-］/Qprec-sqrt［-］/Qprof-gen-sampling/Qssp/Qtrapuv
/RTCc
/RTCs
/RTCu

これらの命令をサポートしていません。

ション開発者の自己責任となります。

に以前のバージョンと互換性がありますが、/fp:<name>/XP/Server 2003のいずれかと、Pentium Áプロセッサ以降の組み合わせが必要です。

自動並列化機能は、安全に並列実行でき

スイッチ

マンデルブロ集合

また、SSE2やSSE3を使用する際も上記のOンスから分岐を排除します。
この結果、基本ブロックのサイズが大き

Fig. 7

たとえば、SSEを使用したプログラムを

Itaniumでは、プレディケート修飾をつけた命令を実行することでプログラムシーケ

1つ注意しておかなければならないことが

VC++ 6.0とソースとオブジェクト、VC++

ベルのマルチスレッド化を効率的に行うこ

対応しています。

・ソース、オブジェクトとの互換性

移植性に優れたOpenMPの自動並列化機

新の64ビット拡張プロセッサPentium Dに見えることになります。

化といった低レベルの細かい作業をユーザ

デフォルト

型のマルチコアプロセッサに対応し、マル
チスレッド環境での実行におけるパフォー
マンスが向上したという点が特徴です。そ×

こで、その性能を検証するべく、シンプルな構造で比較的マルチスレッド化しやすい
マンデルブロ集合アルゴリズムのプログラ

×
×
○
×
×
×
×
×
×
×

ムを準備してみました。マンデルブロは複Table 5特徴があります。Fig. 7のようなスクリーン
ショットをどこかで見たことがある方も多いのではないでしょうか。
せっかくなので、テストは最新のPentiu
m D（3.4GHz）2機搭載マシンと64ビット版

置き換えられるべき
オプション

内 容

/Fm
［file］

マップファイルを生成する
ローカル変数の情報がない.SBRファイルを生成する。このオプショ/Fr［file］
ンはVC++を利用する/G5
Pentiumプロセッサ向けに最適化する
Pentium Pro、PentiumÀ、PentiumÁプロセッサ向けに最適化す
/G6
る
/G7
Pentium4、Xeonプロセッサ向けに最適化する/GB/G6と同じ/Ge
スタックプローブを有効にする/Gf
文字列をプールする/GX[-]
C++の例外処理を有効［無効］にする
関数レベルのリンクを有効化する。関数をパッケージすることによっ/Gyてリンクを最適化する
デバッグビルド時のリリースビルドエラーをキャッチする。リリース/GZ
ビルド時にだけ発生するバグをデバッグビルド（/Od）
でキャッチする
ため、/GZオプションを指定してランタイムチェックを行う/H<n>
外部シンボルの文字数を制限する/ML、/MLd シングルスレッドアプリケーションを作成する/Zd
デバッグ用としてオブジェクトファイルの中に行番号情報を挿入する/Ze
VC++コンパイラ言語の拡張機能を有効にする

なし

/FR
なし
なし
なし
なし

/Gs0
/GF
/EHs
なし

/RTCs
なし
なし
なし
なし

Table 6 ICC 9で廃止されたスイッチ
スイッチ

雑な形をしていて、どんなに拡大しても入り組んだ境界を見ることができるといった互換性のため利用可能だが、将来なくなる可能性のあるスイッチ

スイッチ/Qax<iM>/QIfdiv/QI0f[-]/Qipo-obj/Qx<iM>内 容
指定したプロセッサ専用のコードと、汎用性のあるコードを生成する
i = Pentium Pro, PentiumÀプロセッサ命令
M = MMXテクノロジ命令
PentiumのFDIV、FPREM、FPTAN、FPATANバグ対策をする［しない］
Pentiumの0FHバグ対策をする［しない］/Qipoとともに指定すると実際のオブジェクトファイルが強制的に生成される
指定したプロセッサ専用のコードを生成する
i = Pentium Pro、PentiumÀプロセッサ命令
M = MMXテクノロジ命令

最新開発環境レポート インテルC++コンパイラ 97いと、最新環境でのパフォーマンスを検証

プラグマを無視できるという仕様になって

します。

います。

テストプログラム
テストプログラムのメインの部分はList 1のようになっています。この部分は二重でOpenMPは、一般的にクリティカルなforいようにプリプロセッサに指示しています。

との連携でなせるわざでもあるとも考えら

ルコアやマルチコアが主流になってくるとを使って作られたバイナリを両者で比較・さて、テストはそれぞれのバイナリで3れます。ただ、全体的に多少のコンパイル

考えられます。そのような、今とこれから実行した場合どのような結果になるでしょ

時間とバイナリサイズが大きくなっているの時代、プロセッサに対応しうるコンパイ

うか。残念ながら、今回は執筆中に機材が種類実行します。

ループなどで利用することがもっとも効果

まずは、マンデルブロの全体像を見られように見えます。しかし、バイナリサイズ

ラこそ、最先端をいくICC 9だといえるでそろわなかったため検証できませんでした

的とされています。たとえば、ここで書かるパラメータでのテスト。次に、谷間になが大きくなるのは、OpenMPを使っている

しょう。

が、機会があればまたあらためてレポート

れているっている部分の拡大図（Fig. 8）。さらにそからで、もしこの部分を自分でマルチスレ

先日、AMDからも、デュアルコアを搭載したいと考えています。

ループされていることがわかります。マン#pragma omp parallel forの先端の葉部分に近寄ってみます（Fig. 9）。

ッド化してやれば、手間はかかりますがもしたAthlon X2という新しいプロセッサが発

ICC 9はエクセルソフトから購入できま

デルブロの各部位の深さを調べるために、というのは、「for（ i = 0;……」部分の並列化

予定では、順を追うごとに処理が重たく

っと小さいサイズに抑えることができるは売されました。ハイパースレッディングテ

す。また30日間無料/機能制限なしで利用

面積ぶんの計算を繰り返しています。

を「OpenMPさんよろしく」という意味になずです。

クノロジは搭載されていないものの、SSE3

できる体験版もダウンロードできます。

プログラムの中央付近に注目してくださります。プログラムのどこにもマルチスレい。あまり見慣れないプラグマがあります。

ッド関連のAPI、たとえばCreateThreadな

このプラグマをご存じの方もいらっしゃる

どは書かれていません。

なっていくはずですが……。

テスト結果

なお、誌面にはページの都合上プログラ

命令にも対応し、インテルのPentium Dとムの一部しか掲載されていませんが、この比較してどれほどのパフォーマンスを出せるのか非常に気になるところです。

この機会に、ぜひ最新のインテルC++コ
ンパイラ9を試してみてください。

結果はFig. 10のようになりました（実際テストに利用しているソースコードと各種とは思いますが、本プログラムではマルチ

このように、OpenMPを利用することにの数値はTable 7）。グラフが長くなればな

バイナリ、そしてテスト結果の一覧は、本

ICC 9でも、コンパイルオプションの設

スレッド環境を整えるのにOpenMPを利用

よって、プログラムをお手軽にマルチスレるほどそれだけ時間がかかった（ファイル

誌付録のCD-ROMに収録されているので、定によっては、AMDのデュアルコアプロセ

・Intel C++ Compiler Documentation

しています。

ッド化させることができます。なお、Open

サイズが増えた）ということになります。よ検証できる環境にある方はぜひご自分でテッサ上でも動作するアプリケーションの開・Intel C++ Compiler Reference

OpenMPは、通常このように#pragmaでMPの詳しい仕様などについては、OpenMPって、グラフが短いほど優秀な成績というストしてみてください。

発が可能と思われますが、このコンパイラ

・Intel C++ Compiler Options

場所を指定するしくみになっており、Open

サイト（http://www.openmp.org/）を参照しことになります。

MPに対応しているコンパイラは指定されてください。ICC 9は、現状OpenMP2.0のた部分のコードのブロックに対して並列化

APIに対応しています。

期待していたとおり、マルチスレッド化

Fig. 10

まとめ【参考文献】

テスト結果

全体の実行速度されたバイナリのほうが圧倒的に高速です。

を行います。逆にOpenMPを認識できない、

ちなみに、シングルスレッドのバイナリ

Pentium Dプロセッサのパワーのおかげと今回、新しいインテルコンパイラに触れ

たとえば古いタイプのコンパイラは、このを生成する場合は、このプラグマを通らなもいえますが、それに対応したコンパイラてみて、非常に使いやすく、また新しいPC
環境での最適化の効果もわかりやすかった

マンデルブロ集合メイン部分

List

1

Fig. 8マンデルブロ集合（谷間部分）

多くの開発者が利用している、たとえば

void CMANDEL::Calculation(){
float x, y;
float dx, dy;
int i, j;x = xmin + i * dx;
a = x;b = y;
a2 = a * a;b2 = b * b;count = maxiter;while( a2 + b2 <= 4 && count ){b = 2 * a * b - y;a = a2 - b2 - x;
a2 = a * a;b2 = b * b;count--;}
write[m_wx * j + i] = count;
}

8

100

200

300

400

500

600

700

800

900

1000

1272

コンパイラもすばらしい最適化機能を持っていますが、現状で最新のマルチコアプロ
セッサ完全対応をうたったPC用のコンパイ

0

100

200

300

400

500

600

700

800

900

1000

葉部分の実行速度

ラはICC以外にはありません。
インテルやAMDなどの大手PC用のプロ

1914

セッサを開発しているメーカーがお互い競い合うように相次いで発表を行っているとおり、今後PC向けのプロセッサは、デュア

Fig. 9マンデルブロ集合（葉部分）

Table 7

0

100

200

300

400

500

600

700

800

900

1000

テスト結果数値

コンパイラ

バイナリ

32ビット
ICC 9.0
64ビット

}
}

0

谷間部分の実行速度

マイクロソフトのコンパイラやそのほかの

dx = xmax - xmin;
dy = ymax - ymin;dx /= m_wx;
dy /= m_wy;
for( j = 0; j < m_wy; j++ ){y = ymax - j * dy;#if USE_OPENMP#pragma omp parallel for#endiffor( i = 0; i < m_wx; i++ ){float a, b, a2, b2;
long count;

ので、これはよいと感じました。

VC++.NET 2003

32ビット

スレッド
シングル
シングル
シングル
マルチ
シングル
シングル
シングル
マルチ
マルチ
シングル

主な最適化オプション/Od （デバッグ）/O3 /QxN /fp:fast/O3 /QxN /Ipo /fp:fast /openmp/O3 /QxN /Ipo /fp:fast /openmp/Od （デバッグ）/O3 /QxP /Qip /fp:fast/O3 /QxW /Qip /fp:fast/O3 /QxP /Qip /fp:fast /openmp/O3 /QxW /Qip /fp:fast /openmp/O2 /GL （リリース）

ファイル
コンパイル
（KB）
時間
（ミリ秒） サイズ

7
6.5
6.6
6.8
4.8
6.5
6.5
6.8
6.8
2.6

145
72
72
140
158
79
73
174
174
44

実行速度
（ミリ秒）
全体
谷間
葉

119
60
60
43
306
60
60
41
41
76

467
251
252
96
1272
251
251
95
95
313

691
377
378
161
1914
377
377
158
159
469

最新開発環境レポート インテルC++コンパイラ 99VTuneで最適化を生かす
インテルC++コンパイラには、さまざま

David Levinthal/Vladimir Tsymbal
翻訳：森口啓子（XLsoft Corporation）

なコンパイラオプション、プラグマ、およたコンパイラの最適化レポートの一部を示

最適化レポート

します。Fig. 3の太線で囲まれている部分
を見てください。

び言語拡張が用意されています。開発者はコンパイラはさまざまな最適化オプションを提供していますが、大規模な商用アプリケーションでは、これらのオプションを使用し、ポインタを

プロジェクト内のすべてのファイルにもっとも高度な最適化を適用することは現実的ではありません。

一義化してオーバーラップしないようコン

それは、全体のコンパイル時間が長くなるばかりか、最適化に伴うオーバーヘッドなどのリスクが増す

パイラに指示できます。/Oaおよびfno̲alia

可能性があるからです。この問題の解決策として、インテルのVTuneパフォーマンスアナライザを使っ

sコンパイラオプションはすべてのポインて、効率的にパフォーマンスの向上を図る方法を紹介します。

タ、 restrict キーワードは特定のポインタ、

Fig. 3は、このセクションについて説明しこの最適化レポートは、ソースの50行目

Fig. 1 VTuneのソースビューでList 1周辺を表示

ivdepプラグマは特定の範囲のポインタがそはじめにレベルに上げて最適化をかけることは一見ツールでベースのビルドを実行して、CPU

合理的に思えますが、実際にはさまざまな使用率の大部分（およそ85〜95％）を占める/Oaおよびfno̲aliasオプションを指定す問題が起こるため、高度な最適化オプショ

ようなソースファイルの一覧を作成する方

ることは、コンパイラがプログラム全体の法です。

すべてのポインタが一義化されていると仮

れぞれ独立していると仮定します。

ひと言でアプリケーションの「最適化」とンを選択できない場合があります。さらに、

いっても、さまざまな手法があります。し実行サイズが非常に大きなアプリケーショ

かし、最適化のためにコンパイラに提供さンでは、中心となるバイナリの大部分をキれているあらゆる手段を導入した結果、コン

ャッシュに残しておくことがパフォーマン

パイル時間が長くなったり、オーバーヘッ

スの点から非常に重要になります。このた

通常、上記でCPU使用率を占めるものとプラグマを使用する方法がより実質的なアドなどの弊害が生まれる可能性もあります。

め、最適なコンパイラオプションセットは、してリストアップされるファイルは全体のプローチです。これらのオプションは、パ

単純に選択できるものではありません。

約1％にすぎません。開発者がこれらのフフォーマンス向上に焦点を当てたコンパイ
ラオプションといえます。

この問題に対する解決策として、実行時定するため、最善だとはかぎりません。特

HOTSPOTを探す

定のポインタ宣言でrestrictキーワードを使用するか、CPUの利用率が高い関数にivdep

間への影響が大きいソースファイルにのみ

アプリケーションは、さまざまな問題やァイルに対して個々の最適化を設定すれば、高度なコンパイラオプションを適用する方

データセットを制御するいくつものプログ

より柔軟で効果的にパフォーマンスを向上

このアプローチについて、インテルC++

法があります。

ラムやデータが複雑につながっていたり、できます。このアプローチでは、最適化レコンパイラ 9とVTune 7.2を使用して作成しインテルVTuneパフォーマンスアナライ

複数のアプリケーションが組み合わされるベルを変更しても、再コンパイルするファたサンプルプログラムで説明します。Cプザ（以下VTune）を使用すると、高度なオプように動作します。ソースで複雑な部分は、

イルは一部だけなので、リビルドにかかる

ログラムに含まれている関数DataCalcのコションを適用すべきコードセクションを簡初期化と問題のセットアップコードを制御

時間も短縮されます。

ードセクションをList 1に示します。

単に特定することができます。

する部分です。これらのソースファイルは、

このようなアプローチが明らかに有利な

このプログラムを対象に、VTune 7.2を実VTuneと最適化コンパイラを使用し、開コードの大部分を占めることがよくありま

ケースは数多くあります。その一例として、

行すると、この関数がプログラム実行時間

発の労力、時間およびリスクを最小限にしすが、この部分では費やされるCPU時間を

C/C++におけるポインタの一義化問題があの80％以上を費やしている Hotspot であながら、効率的にパフォーマンスを向上す考慮する必要はありません。

げられるでしょう。ポインタのエイリアス

り、最適化の有力な候補であることが表示

上記のような問題点があるにもかかわらは言語規格の一部として仮定されています。

されます（Fig. 1、2）。

ず、ほとんどのメイクファイルには、プロ

コンパイラは、ポインタが参照するデータ

ジェクト全体をビルドするオプションが1

領域がオーバーラップすると仮定します。

セットしか含まれていません。

これがどういうことか調べてみましょう。

る事例を紹介します。

事例

配列AとBが関数への引数として渡される

大規模なアプリケーション（たとえば、50最適化の標準的なアプローチは、コンパ0個以上のソースファイルを持つもの）のコ

イラオプションのレベルを（通常はO2〜O3

ンパイルは、注意して行わなくてはなりまに）上げることになります。次に、最適化せん。できるだけ高速な実行ファイルを作できないファイルを判断するために時間と成することが最終目標の場合でも、コンパ

労力をかけてデバッグを行い、それらのフ

この場合、配列AとBはデフォルトでオー

イル時間、アルゴリズムのデバッグ、演算ァイル用に特別なメイクを作成します。

バーラップすると仮定されます。そのため、結果の安定性など、さまざまな要件を考慮する必要があるからです。
コンパイラオプションをもっとも高度な10

DAXPYループを例にあげます。

List

void DataCalc (int size,
int *x, int *y, int * z){
int i;
int A = 1;
for(i=0;i<size;i++){z[i] =
z[i] + A * x[i] + A * y[i] +x[i]*y[i] + x[i] + y[i];}A[I] = A[I] + Y*B[I];これらの作業を最小限に抑えるための、

A［I］はB［I+1］と同一と判断され、ループはアンロールできず、2回目の反復は独立しテルのVTuneのようなパフォーマンス解析て実行できません。

DataCalc関数のコードセクション

1

for(I=0; I<len; I++)よりシンプルで強力なアプローチは、インFig. 2 VTuneのHotspotビューでList 1周辺を表示}

特別記事 最適化コンパイラの効率的なパフォーマンス向上

11

プションと内部ループを完全にアンロール

トウェアパフォーマンスサポートエンジニ

奨学金）受領。

しています。この原因は、DataCalc関数にするオプションの2つのオプションがありまアの第一人者。1995年にインテルへ入社、●Vladimir Tsymbal

渡されているポインタが一義化されていな

す（除算で和が必要になることから、ルースーパーコンピューティングシステム部門

VTuneの開発エンジニアの1人。2005年2

いことにより、ソフトウェアパイプライン

プの順序を効果的に変更できないため、こを経て、マイクロプロセッサ・ソフトウェ

月にインテルへ入社。インテル入社前は、やSIMD命令でループを並列化できないた

こでは、内部ループを完全にアンロールすア・ラボに勤務。インテルに入社する前は、医療機器用の組み込みソフトウェアおよび

めです。そこで、List 2のように、すべてのるオプションが正解）。この変更の目的は、フロリダ州立大学の物理学教授をしていドライバを開発するロシアの営利会社で勤ベクトルの依存性を無視するようにコンパ

コンパイラが、Pentium4プロセッサの場合た。DOE OJIアワード、NSF PYIアワード務。タガンログ州立電波工学大学の博士号

イラに指示するivdepプラグマを挿入したあはSSE3命令を生成して、Itaniumプロセッ受賞。スローン財団フェローシップ（研究を取得。

と、プログラムを再コンパイルします（Fig.

サの場合はソフトウェアパイプライン機能

4）。

を有効にするためです。プロファイルに基にロード/ストアの矛盾があることを指摘

Fig. 3

インテルC++コンパイラ最適化レポート

コンパイラは、ループを並列化できるよづく最適化を使用すると、コンパイラは2うになり、矛盾も解消されます。コードをつ目のオプション（内部ループを完全にア変更したあとVTuneで実行すると、DataCa

ンロールする）を自動的に実行し、非常にlcのクロックサイクルの数が124から95に下局所的な問題にのみプロファイリングを使がっていることがわかります（Fig. 5）。

用するように制限します。

Fig. 5 VTuneのHotspotビューでList 2周辺を表示

つまり、実行時間が23％向上していま結論す。この特定のループが実行時間の大部分を費やす大規模なプログラムのカーネルな
らば、劇的に実行時間を短縮できることになります。

この事例では、VTuneを使用して、最適

Fig. 4 ivdepプログラマを挿入後のVTuneのソースビューでList 2周辺を表示

化コンパイラを微調整し、アプリケーショ

List 3の例（Fortran90の例）は、内部ルーンのパフォーマンスを大幅に向上する、簡プが非常に小さく、外部ループのトリップ

単で強力なテクニックを紹介しました。こ

カウントが非常に大きい、ネストしている

れらのインテル ソフトウェア開発製品に関ループの場合です。

する詳細は、エクセルソフトのWebサイト

問題は、ループ範囲がコンパイラによっ

http://www.xlsoft.com/intelを参照してくて変数としてみなされている場合にのみ発ださい。上記サイトからは無料体験版のダ生します。つまり、コンパイラがループ範

ウンロードも可能です。

囲を認識できずに、内部ループのトリップ
カウントが大きいと仮定してしまう場合です。この場合、コンパイラは、SIMD命令を有効にしてループをアンロールするか、

著者について●David Levinthal
VTuneのItaniumプロセッサにおけるソフ

ソフトウェアパイプラインアルゴリズムを使用しようとします。
しかし、実際には内部ループは非常に短いので、ループのアンロールやソフトウェ
アパイプラインは不適当な手法といえます。
内部ループが非常に短い場合、ループのアンロール剰余アルゴリズムが有効になりま

Listivdepプラグマを挿入

List

ネストしているループ（Fortran90）

2

3void DataCalc (int size, int *x, int *y, int *z){
int i;
int A = 1;
#pragma ivdep
for(i=0;i<size;i++) {z[i] = z[i] + A * x[i] + A * y[i] + x[i]*y[i]+ x[i] + y[i];}}DO I = 1, Nouter ! Nouter is large
Sum = 0.
DO j = 1, Ninner ! Ninner is 2
Sum = Sum + A(I, j)*B(I, j)
END DO
Factor(j) = 1./Sum
END DO

す。ループのアンロール剰余アルゴリズム
は、内部ループをすべて自動的にアンロー
ルしようとします。
ここでは、ループの順序を入れ替えるオ

12

特別記事 最適化コンパイラの効率的なパフォーマンス向上

13