THE PARALLEL
Issue 112012 年 9 月

UNIVERSE

XE

パフォーマンスを向上させる 10 項目の機能James Reinders

PARALLEL UNIVERSE

目次
編集者からのメッセージインテル® Parallel Studio XE 2013 がもたらす「ニューノーマル (新たな常識)」
JAMES REINDERS
4
インテル® Parallel Studio XE 2013:
パフォーマンスを向上させる 10 項目の機能
JAMES REINDERS

5

アプリケーションを高速化するインテル® Parallel Studio XE 2013 スイートのコンポーネントと新しい機能およびアプリケーションの可能性について説明します。

インテル® ソフトウェア開発ツールを使用した HMMER の解析
WALTER SHANDS

7

スレッドエラーやメモリーエラーの確認からパフォーマンスやコードの最適化まで、最新世代のマルチコア・プロセッサーで HMMER のようなアプリケーションを開発するテクニックを紹介します。

ポインターチェッカー: 範囲外のメモリーアクセスの迅速な検出
KITTUR GANESH

20

ポインターチェッカーは、メモリーが破壊される前に範囲外のメモリーアクセスをキャッチするように設計されています。ポインターチェッカーを効率的に使用する方法に加えて、セキュリ
ティーとランタイムのトレードオフの適切なバランスを設定する方法を説明します。

インテル® (Visual) Fortran Composer XE の新しい並列プログラミング機能
STEVE LIONEL
21
Fortran に優れた並列化をもたらす新しい 2 つの機能、DO CONCURRENT と Co-Array の概要を説明します。

インテル® マス・カーネル・ライブラリー (インテル® MKL) とインテル® コン
パイラーを使用し、実行するたびに数値再現性のある結果を取得
TODD ROSENQUIST および SHANE STORY
25
パフォーマンスの向上と、再現性のある結果およびランタイムの一貫性のバランスをどのように取れば良いでしょうか。これらのテクニックを利用することで、管理可能な制約セットの下、アプ
リケーションで再現性のある結果を生成できます。

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

2

PARALLEL UNIVERSEJames Reinders が並列化ツール・
スイート、インテル® Parallel Studio
XE 2013 の機能を紹介します。

3

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

PARALLEL UNIVERSE

編集者からのメッセージインテル® Parallel Studio XE 2013 がもたらす「ニューノーマル (新たな常識)」
並列化で変わったものと変わらないもの

並列化は至るところで行われ、並列プログラミングは「ニューノーマル ( 新たな常識)」となりました。しかし、アプリケーション

そして、この 10 項目の内容をさらに詳しく紹介する、3 つの記事を取り上げています。ポインターチェッカーに関する記事、
For tran 機能に関する記事、そして実行するたびに (どのプロの記述、デバッグ、チューニングがプログラマーの仕事であること

セッサーで実行しても) 数値再現性のある結果が得られる新しは変わりません。我々はニューノーマルを作成するためのハード

い機能に関する記事です。3 つめの機能は、最新のインテル®

ルを上げただけなのでしょうか。そうかもしれません。プログラミ

Parallel Studio XE の新しいオプションセットにより、演算の順

ングはますます高度なものとなり、ツールに要求される機能も増序によって結果が異なる浮動小数点の数値表現の性質に対処しえ続けることが予想されます。

ます。

インテルは、このニューノーマルをインテル® Parallel Studio

また、実際の使用例として、インテル® ソフトウェア開発ツー

XE の最新エディションの新機能でサポートするために膨大な投ルを使用した HMMER の解析について紹介します。この記事で資を行いました。

は、インテル® VTune™ Amplifier XE のイベントベース・サンプ

インテル® Parallel Studio XE 2013 ではソフトウェア開発のさリング解析とインテル® Composer XE のコンパイラーの最適化

まざまな要素にわたり、ニューノーマルに必要なサポートを追加機能を使用して、SPECint* のコンポーネントである hmmsearch

するため、ツールセットを更新しました。

と hmmbuild のビルドおよび解析を行います。

この号では、インテル® Parallel Studio XE 2013 の新しい機能を紹介します。
「パフォーマンスを向上させる 10 項目の機能」のこの号で紹介する新しい機能はどれも興味深いものばかりです。
皆さんがニューノーマルの世界に辿り着くのをお待ちしています。

記事では、重要な新機能の概要を説明します。一つ一つの機能を詳細に説明しようとすれば、機能ごとに 1 つの号を用意してJames Reinders

も足りないかもしれません。

インテル コーポレーションの並列プログラミング・エバンジェリスト兼ディレクター。2012 年に Morgan Kaufmann から出版された新しい書籍、『Structured
Parallel Programming』の共著者。このほかに、『Intel® Threading Building Blocks:
Outfitting C++ for Multicore Processor Parallelism』（日本語:『インテル スレッディ
ング・ビルディング・ブロック ―マルチコア時代の C++ 並列プログラミング』、中国語、韓国語の翻訳版があります）などの並列化に関する文献を発表しています。

4

PARALLEL UNIVERSE

インテル® Parallel Studio XE 2013:
パフォーマンスを向上させる 10 項目の機能
並列プログラミング・エバンジェリスト兼ディレクター

James Reinders

インテル® Parallel Studio XE 2013 には、最新の最適化や新しい

インテル® Parallel Studio XE 2013 で再コンパイルするだけで、プロセッサーのサポートだけでなく、非常に革新的なさまざまなアプリケーションのパフォーマンスを向上させることができます。

機能が含まれています。

最新のコンパイラーでリビルドして最新のライブラリーとリンク

このツール・スイートは Microsoft* Visual Studio * およびGNU ツールにシームレスに統合されるため、これまでの開発環境への投資が無駄になりません。

1. 最新のインテル® プロセッサーのサポート
AVX2、TSX、FMA3 のサポートが追加されました。この更新により、
新しくリリースされた第 3 世代インテル® Core™ vPro™ プロセッサー(開発コード名: Ivy Bridge) マイクロアーキテクチャーと次の (開発
コード名: Haswell) マイクロアーキテクチャーの両方がサポートされます。以前のインテル® プロセッサーおよび互換プロセッサーとの互換性を保ちながら、最新のインテル製品で強化されたパフォーマン
スを活用できます。
2. インテル® メニー・インテグレーテッド・コア(インテル® MIC) アーキテクチャーのサポート

プロトタイプシステムとプリプロダクション・システムにおける 1 年
以上のテストを経て、インテル® MIC アーキテクチャーのサポートが追加されました。最初のインテル® Xeon Phi™ コプロセッサー (開発
コード名: Knights Corner) を利用するためにほかのツールは必要ありません。使い慣れたインテル® ソフトウェア開発ツールによってサポートされています。新しいツールを使用することなく、インテル®
MIC アーキテクチャー対応のコードを生成、デバッグ、最適化することができます。

3. 高度な数値再現性機能
ベータテスターの評判が最も高かった新しい機能です。この革新的な新しい「条件付き数値再現性」機能は、結合則の成り立たな
い浮動小数点演算を制御する優れた機能で、実行するたびに (どのプロセッサーで実行しても) 数値再現性のある結果が得られる、パフォーマンス・ペナルティーが非常に低いオプションを提供します。インテル® マス・カーネル・ライブラリー (インテル® MKL) を使用した浮動小数点演算の再現性、OpenMP* の特別なサポー
ト、インテル® スレッディング・ビルディング・ブロック (インテル®
TBB) 向けに追加されたオプションは新たな可能性を広げます。
4. プロファイル・データの追加と使いやすさの向上
不可解なパフォーマンス・データを理解するために費やしていた
時間を削減できる、新しい強力な帯域幅とメモリーアクセス解析がインテル® VTune™ Amplifier XE に追加されました。

することで、最新のプロセッサーを有効活用できます。
この強力なツール・スイートの特長を表す 10 項目の機能についてまとめました。

6. 新しいスレッド化アシスタント: インテル® Advisor XE
インテル® Advisor XE は、スケーラブルで保守可能な C、C++、C#、
Fortran コードの生成を支援します。アプリケーションへの並列化の実装を単純化し、実装前に別のアプローチを評価できます。
7. Fortran 規格のサポート

インテル® Fortran は、Fortran 2003 規格の機能と Fortran 2008
規格の主要な機能 (Co-Array を含む) を幅広くサポートします。イ
ンテルは今後もソフトウェア開発製品で Fortran をサポートしていく予定です。もちろん、VAX Fortran*、Compaq* Visual Fortran、
Fortran 95、Fortran 90、Fortran 77、Fortran 66 を含む Fortranのサポートと、BLAS、LAPACK、ScaLAPACK、スパースソルバー、
高速フーリエ変換、ベクトルマス、その他のライブラリーのサポートにおける豊富な後方互換性も維持します。

8. C++ パフォーマンス・ガイド
5 ステップのプロセスでパフォーマンスの向上を導く新しい C++ パ
フォーマンス・ガイドが提供されます。
9. C および C++ 標準規格のサポート
C および C++ のサポートに新しい C++11 と C11 機能の先行サポートが追加されました。C99 を含む従来の標準規格のサポートと、IEEE 754-2008 10 進浮動小数点演算のサポートもこれまでどおり継続されます。
10. エラーの検出と排除: インテル® Inspector XE
インテル® Inspector XE は、C、C++、C#、Fortran のパフォーマンス
を保証し、アプリケーションの信頼性を高める効率良い方法を提供します。新しいヒープ拡張解析機能は、メモリーリークを検出する重要な新しい方法です。

30 日間の評価版ダウンロード

5. ポインターチェッカー
割り当てられたアドレスを超えてメモリーアドレスにアクセスする
コードを検出する、新しいコンパイラー・ベースの診断ツールです。
発見が困難なメモリー破壊問題の特定を支援します。

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

PARALLEL UNIVERSE

強力なスイートを構成する
4 つの主要コンポーネント:
1.

2.

3.

4.

C++ /Fortran 最適化コンパイラーとライブラリー:
インテル® Composer XE は、パフォーマンスの向上に取り組む開発者向けの高度に最 適化されたツールで、インテル®
C++ コンパイラー、インテル® Fortran コンパイラーに加えて、スレッド化 、数値 演 算 、マルチメディア、信号 処 理などのパ
フォーマンス・ライブラリーが含まれています。インテル® Cilk™
Plus、インテル® TBB、OpenMP * の並列化モデルをサポートしており、今日および将来のハイパフォーマンス・コンピューティ
ング・システムを容易に活用できます。インテル® MKL とインテル® インテグレーテッド・パフォーマンス・プリミティブ (インテル® IPP ) には、パフォーマンスの向上と開発時間の短縮に役立つ豊富なルーチンが含まれています。
革新的なスレッド化アシスタント (Linux* および Windows*):
インテル® Advisor XE は、C、C++、C#、Fortran 開発者向けのス
レッド化アシスタントです。並列化によりパフォーマンスが向上する領域の特定や重要な同期問題の検出を支援します。インテル® Advisor XE を使用すると、実際に実装を行う前に別のアプローチを評価して、スピードアップの予測、正当性問題の特定を行い、最も投資効果の高いオプションを選択することができます。この機能の優れている点は、コーディングとデバッグを行う
前にアプローチを評価できることです。コードに並列化を実装する方法を検討する際に非常に役立ちます。
シリアルおよび並列パフォーマンスを最適化:
インテル® VTune™ Amplifier XE は、アプリケーションのパフォー
マンスをチューニングするための強力なパフォーマンス/スレッド・プロファイラーです。C、C++、C#、Fortran、アセンブリー・
コード、Java コードをプロファイルして、hotspot、スレッド化、
ロックと待機、DirectX*、帯域幅、その他の役立つパフォーマン
ス・データを提供します。
より信頼性の高いアプリケーションを作成:
インテル® Inspector XE 2013 は、Windows* および Linux* のシ
リアル/並列アプリケーションのメモリーエラーとスレッドエラー
を容易に検出します。C、C++、Fortran 開発者向けのスタティッ
ク解析機能は、インテル® Studio XE 製品に含まれています。ア
プリケーションをリリースする前にアクティブで潜在的な問題を
ピンポイントで指摘する機能は、インテルの独創的なアイデアを実装したものです。

インテル® Parallel Studio XE の詳細

技術仕様の概要
プロセッサーのサポート

インテル® Xeon® プロセッサー、インテル® Core™ プロセッサー、インテル®
Xeon Phi™ コプロセッサーを含む、さまざまな世代のインテル® プロセッ
サーおよび互換プロセッサーでの動作を検証済みです。

オペレーティング・
システム

Windows* および Linux* をサポートします。コンパイラーおよびライブ
ラリーは、Apple* OS X* 上で XCode*
開発環境のアドオンとして利用することもできます。

開発ツールと環境

各プラットフォームの規格に準拠しているコンパイラー (Microsoft* コンパ
イラー、GNU コンパイラー、インテル®
コンパイラーなど ) と互換性があります。GNU ツール、Microsoft* Visual
Studio* 2008/2010/2012 などのツールに統合できます。

プログラミング言語

C、C++、Fortran 開発を広範囲にサポートします。Java や C# などの .NET 言語
を含むプログラムもサポートします。

サポート

すべての製品アップデート、インテル®
プレミアサポート、インテル® サポート
フォーラムを 1 年間ご利用いただけます。インテル® プレミアサポートから、テクニカルサポート、テクニカル
ノート、アプリケーション・ノート、および最新のドキュメントにアクセスできます。

コミュニティー

インテル® サポートフォーラムでは、
ソフトウェア開発について活発な情報交換が行われています。
http://software.intel.com/en-us/forums(英語)システム要件ハードウェア要件とソフトウェア要件の詳 細は、次のページを参照してください。
www.intel.com/sof t ware/products/
systemrequirements/ (英語)6PARALLEL UNIVERSE

7

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

PARALLEL UNIVERSE

ソフトウェア開発エンジニア

Walter Shands

インテル® ソフトウェア
開発ツールを使用した
HMMER の解析

この記 事では、 インテル® Parallel Studio XE 2013 を使 用して HMMER ( http://hmmer.
janelia.org/ ( 英語 )) のビルドおよび解析を行い、ツールの機能を説明します。HMMER は、SPECint の 2 つのコンポーネント、hmmsearch と hmmbuild を含むアプリケーションのセットです。まず、インテル® VTune™ Amplifier XE のイベントベース・サンプリング解析を使用して、hmmsearch のパフォーマンス問題の原因となっているコードパス、コンテキスト・
スイッチ、スレッド化部分を特定します。次に、インテル® Composer XE コンパイラーのコード最適化機能を使用して、インテル® Xeon® E5 プロセッサーにおける hmmsearch のパ
フォーマンスを向上させます。さらに、インテル® Inspector XE を使用して、hmmsearchに含まれるメモリーエラーとスレッドエラーを特定します。

8

PARALLEL UNIVERSE

hmmsearch は、隠れマルコフモデルと呼ばれるプロファ

次のステップでは、インテル® VTune™ Amplifier XE を使用してイルを使用して、タンパク質配列データベースの同族体を検索しアプリケーションの hotspot を調べます。このプロファイラー・

ます。globins4.hmm にはプロファイルが含まれており、uniprot_

ツールは、オーバーヘッドの低いテクニックを使用して、プロセッ

trembl.fasta は 10GB の配列データベースです。

サー・アーキテクチャーやアセンブリー・コードの知識がなくて

hmmsearch には MPI バージョンもありますが、今回の実験でも、マルチコア・パフォーマンスのボトルネックをすばやく発見するは非 MPI バージョンを使用しました。8 コアのインテル® Xeon®
E5-2680 プロセッサー (2.7GHz、ハイパースレッディング有効) とことができます。データを収集するためにアプリケーションにコー

23.4GB のメモリーを搭載したシステムで hmmsearch を実行しま

インテル® VTune™ Amplifier XE で hmmsearch のソースコード

した。GCC とインテル® C コンパイラーを利用し、両方とも構成スク

行を表示するには、リリースビルドにシンボルを含める必要がある

リプトで提供された設定を使用しました。最初に使用したデフォル

ため、–g オプションを追加します。ソースビューで該当するコード

トの GCC のオプションは次のとおりです。

がすべて表示されるように、–fno-inline-functions オプドを追加する必要がないことに注意してください。

ションも追加しています。
インテル® VTune™ Amplifier XE の hotspot 解析は、アプリケー
gcc -std=gnu99 -O3 -fomit-frame-pointer -maligndouble -fstrict-aliasing –pthread –msse2

ションで最も CPU アクティビティーが高い部分と、スレッド・オー
バー・タイムの CPU アクティビティーの量を表示します。(図 1)
インテル® VTune™ Amplifier XE の hotspot ビューでは、最もこのアプリケーションは SSE2 以降の組込み関数を使用して最CPU 時間を費やしている関数が p7_MSVFilter であることが分か適化されたアルゴリズムを利用するため、最低でも SSE2 命令セッ

ります。関数名をダブルクリックすると、関数のパフォーマンスをトをサポートする必要があります。

最適化するために使用されている SSE 組込み関数の呼び出しが最初に使用したデフォルトのインテル® コンパイラー・オプショ
ンは次のとおりです。

icc -O3 -ansi_alias -pthread

表示されます。アセンブリー・ビューでは、ベクトル命令が使用されているにもかかわらず、インテル® Xeon® プロセッサーの 256
ビット・レジスターや AVX 命令を活用できていないことが分かります。(図 2)インテル® コンパイラーで p7_MSVFilter のオリジナルの C コー

ドをコンパイルして、ターゲットマシンで利用可能な命令セットにあるコンパイラーから別のコンパイラーへアプリケーションを移植する場合の課題の 1 つは、アプリケーションのビルドに使用

合わせて関数がベクトル化されたため、128 ビット・レジスターの使用が制限されている可能性があります。

するコンパイラー・オプションがサポートされているかどうかを確

スレッド・タイムライン・ビューから、ワーカースレッドで使用さ認することです。インテル® C コンパイラーは、GCC などのコンパイ

れている CPU 時間は少ないにもかかわらず、1 つのスレッドで多くラーでも有効な多くのオプションをサポートしています。インテル®

の CPU 時間が費やされていることが分かります。このスレッドは、C コンパイラーは GCC で生成されたオブジェクト・ファイルと互換

シーケンス・データベース・ファイルを読み取っているスレッドであることがこの後で判明します。(図 3)性のあるオブジェクト・ファイルを生成するため、アプリケーショ
ンの一部をインテル® C コンパイラーでコンパイルし、残りの部分
を GCC でコンパイルすることも可能です。
インテル® C コンパイラーを使用して -O1、-O2 または -O3
オプションを指定すると、-fomit-frame-pointer オプションが設定されます (このオプションを明示的に指定する必要はありません) 。-malign-double オプションは、IA-32 アーキテクチャー・ベースのシステムで最適なパフォーマンスになるように、
double、long-double、および long-long 型でアラインします。このオプションはインテル® C コンパイラーで使用できます。
次のコマンドラインを使用してアプリケーションを開始しました。

「より大幅にパフォーマンスを向上させるには、ファイルの読
み取りによるアプリケーションのシリアル化問題を解決する必要があります。」./hmmsearch globins4.hmm ../../
uniprot_trembl.fasta

9

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

PARALLEL UNIVERSE

図1

図2

図3

10

PARALLEL UNIVERSE

アプリケーションは、マシンのハードウェア・スレッド数 +1 (ハイパースレッド・マシンの場
合はハイパースレッド数 +1) のスレッドを生成します。ここでは、17 のスレッドが実行されています。スレッド数を 5 スレッドに制限して hmmsearch を実行すると、17 スレッドの場
合よりもアプリケーションが適切にスケールされるようになりました。(図 4)
その証拠に、17 スレッドでは 67.418 秒かかっていた実行時間が 4 スレッドでは62.561 秒に短縮されています。
5 スレッドの hotspot 表示でスレッド別に結果をフィルターすることにより、最も上位のスレッドはデータファイルを読み取っているスレッドであることが分かりました。(図 5)

図4

図5

11

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

PARALLEL UNIVERSE

17 スレッドのケースでインテル® VTune™
Amplifier XE のロックと待機解析を行うと、シーケンス・データベース・ファイルを読み取っているスレッドからワーカースレッドに(黄色の線で示された) 非常に多くの移行が行われていることが判明しました。(図 6)

hmmsearch は、生産/消費モデルを使用しており、データをワーカースレッド ( 図のpipline_thread ) のキューに入れた生産ス
レッド (図の 0xa055) が、ワーカースレッドにブロードキャスト・メッセージを送ったと
きに (生産スレッドからワーカースレッドへの) スレッドの移行が行われています。
拡大すると、スレッドの実行時間 (深緑)がスレッドの待機時間 ( 薄緑 ) よりも少ない、つまり生産的な作業が可能な時間が無駄になっていることが分かります。(図 7)

4 スレッドしか使用していない hmmsearchのスレッドビューを拡大して比較してみましょう。データファイルを読み取っている (図図6で一番上の) スレッドからの移行は通常、生産スレッドからワーカースレッドへ作業を移動した結果によるものです。(図 8)

しかし、17 スレッドの hmmsearch では、

多くのスレッドの移行は作業が完了した結果ではありません。(図 9)
さらに 17 スレッドのケースを拡大すると、これらのスレッドの移行は、データブ
ロックをワークキューで処理する準 備が図7できたことをワーカースレッドに知らせる
pthread_cond_broadcast 呼び出しの結果であることが分かります。データブロックを扱えるのは一度に 1 つのスレッドのみで、ほかのスレッドは再度待機しなければなりません。(図 10)5 スレッドのケースでは、処理するデータ

図8

ブロックを待つスレッドは 2 つのみで、1 つのスレッドを除いてすべてのスレッドが活用されています。(図 11)
つまり、hmmsearch パイプライン・スレッ

ドが 4 つ以上になると、スタベーションが発生することになります。データファイルを読み取るスレッドは、4 つのワーカースレッ
ドが計算を続けられるほどデータを速く提供できないのです。
図912

PARALLEL UNIVERSE

インテル® VTune™ Amplifier XE の解析により、最も時間を費やし

コードを再構築して、コンパイラーがループをベクトル化し、ているコードは、msvfilter.c ファイルの p7_MSVFilter で SSE 組込

インテル® Xeon® アーキテクチャーを活用するコードを生成すみ関数を使用して最適化された MSV アルゴリズムであることが分るようにしたところ、最適化レポートで、2 つのループがベクトかりました。組込み関数で最適化されたコードには、より高速になル化されたことが示されました。

るように、ベクトル化による最適化も含まれています。
インテル® コンパイラーが非組込み関数の最適化されたコードを効率良くベクトル化できるかどうかを確認するため、generic_msv.c
ファイルの p7_GMSV 関数で最適化されていない C コードを使用す

generic_msv.c(88:7-88:7):VEC:p7_
GMSV:ループがベクトル化されました。

るようにアプリケーションをコンパイルしました。この場合も、MSV
アルゴリズムが hotspot であることが表示されました。(図 12)

generic_msv.c(108:7-108:7):VEC:p7_
GMSV:ループがベクトル化されました。

令やインテル® Xeon® プロセッサーの YMM レジスターを活用していない 1 つのループであることも判明しました。(図 13)

さらに、インテル® VTune™ Amplifier XE のアセンブリー・ビュー

MSV アルゴリズムの最も時間を費やしている部分が、AVX 命

このコードを使用した hmmsearch の実行時間は、約 4 分 30 秒

です。

で、AVX 命令がより大きな YMM レジスターとともに使用されていることも示されました。(図 14)

アプリケーションの実行時間はオリジナルの実行時間の約半分になりました。
# CPU time:4137.39u 5.02s
01:09:02.41 Elapsed:00:04:30.08# CPU time:2207.74u 4.96s 00:36:52.69
Elapsed:00:02:28.16

インテル® コンパイラーの –opt-report オプションを使用
すると、各関数のインライン展開、ループ、メモリー、ベクトル化、

次に、インテル® Inspector XE を使用して hmmsearch のスレッ並列化に関する最適化レポートが表示されます。p7GMSV 関数でドエラーとメモリーエラーを調べます。インテル® Inspector XE

は、ループがベクトル化されていないことが示されました。

は、アプリケーションの信頼性を高めるために不可欠な、アプリ
ケーションのメモリーとスレッドの動作に関する詳細な情報を提generic_msv.c(80:7-80:7):VEC:p7_GMSV:ループはベクトル化されませんでした: ベクトル依存関係が存在しています。

供します。その強力なスレッドチェッカーとデバッガーを使用すると、実行されるコードパスの潜在的なエラーを容易に見つけることができます。たとえエラーが発生しなかった場合でも、断続的なエラーや非決定的なエラーを検出できます。

図 10

13

13

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

PARALLEL UNIVERSE

図 11「インテル® C コンパイ
ラーおよびライブラ
リーはより高速なコードを生成し、インテル®
VTune™ Amplifier XE は
ボトルネックを検出し、インテル® Inspector XE
はエラーが発生する前にメモリーエラーとス
レッドエラーを正確に特定します。HMMER のようなアプリケーションを開発する場合、これらのツールはすべて
不可欠なものといえる
でしょう。
」

図 12

図 13

14

PARALLEL UNIVERSE

インテル® Inspector XE は、メモリーリー
ク、メモリー破壊、一貫性のないメモリー
API の使用、データ競合、デッドロック、スレッド間のメモリーアクセスを検出します。
インテル® VTune™ Amplifier XE と同様に、特別なビルドを作成したり、データを収集するためにアプリケーションにコードを追加する必要はありません。
メモリーエラーやスレッドエラーの検出では著しいオーバーヘッドが発生するため、より小さなシーケンス・データベース・ファイ

図 14ルを使用し、スレッド数を減らすオプションを指定して hmmsearch を実行しました。
メモリー 問 題 検 出モ ードでインテル®
Inspector XE を実行すると、初期化されていないメモリーへのアクセスがいくつか見つかりました。(図 15)
Locate Memory Problems ペインの行を右クリックすると、初期化されていないメモ
リーへのアクセス問題に関する説明が表示されます。(図 16)

デッドロックとデータ競合の検出モード
では、問題は見つかりませんでした。(図 17)問題を修正したら、インテル® コンパイ

ラーに含まれるインテル® Cilk™ Plus を使用
してアプリケーションのパフォーマンスを向上させます。インテル® Cilk™ Plus は C および C++ の拡張で、マルチコア・プロセッサー
においてプログラムのパフォーマンスを向図 15上させる、迅速、容易、かつ信頼性の高い方法を提供します。インテル® Cilk™ Plus はオープン・スタンダードで、近々 GCC 4.7 でも利用できるようになります。インテル® Cilk™
Plus は、3 つのキーワード (cilk _ for、
cilk _ spawn、cilk _ sync) を使用して新規および既存の C/C++ プログラムを並列化します。

図 16

15

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

PARALLEL UNIVERSE

ここでは、インテル® Cilk™ Plus を使用
してスレッド、mutex、条件変数、ワーク
キューを管理するコードを置換し、より優れたスケジューリングが行われるようにします。しかし、データファイルの読み取りについてはスレッドを同期させる必要がある
ため、アプリケーションの一部はシリアルになります。
インテル® V Tu n e™ A m p l i f i e r XE で
hmmsearch の hotspot を表示すると、シー
図 17

ケンス・データベース・ファイルを読み取る
コードの周囲で mutex による同期のために、CPU が完全には利用されていないことが分かります。しかし、インテル® Cilk™ Plus
実装バージョンの実行時間は 58.272 秒
で、オリジナルの実行時間 67.418 秒よりも短縮されています。(図 18)
再びインテル® VTune™ Amplifier XE のロッ

クと待機解析を行ったところ、まだ多くのス
レッドの移行が行われていました。(図 19)
ロックと待機 解 析のスレッドペインを拡大すると、スレッドの移行はワーカース
レッド間で行われ、各ワーカースレッドで実行されるファイルの読み取りを保護する
mutex の処理に関連するものであることが判明しました。(図 20)

図 18

図 19

16

PARALLEL UNIVERSE

図 20

図 21

このほかのインテル® Cilk™ Plus の強することにより達成できます。インテル®

ファイルを生成せずにレポートを出力す力な機能に、配列表記 (アレイ・ノーテー

コンパイラーのデフォルトの命令セット

る –guide オプションを使用します。イション) があります。配列表記はインテル

は SSE2 で、ターゲットマシンはインテル®

ンテル® コンパイラーのガイド付き自動並

固有の言語拡張で、C/C++ 配列で宣言さXeon® プロセッサー・システムであるため、列化機能は、シリアルコードのアプリケー

れたデータを並列に表現する方法を提供

コンパイルホストでサポートしている最も

ション・パフォーマンスを向上させるアド

します。データを並列に配列表記すること

高水準の命令セットを生成する –xhost

により、エイリアスや依存性の解析にそれオプションを使用して、AVX 命令と大きなバイスを提供します。通常、アドバイスは
3 つのカテゴリー (ソースコードの修正、プ

ほど頼ることなく、コンパイラーで並列化

レジスターサイズを活用します。

ラグマの使用、コンパイラー・オプション)やベクトル化が可能になります。
より大幅にパフォーマンスを向上させ

もう 1 つの重要なコンパイラー・オプ
ションは、ファイル間でプロシージャー

るには、ファイルの読み取りによるアプリ

間の最 適化を有 効にする –ip oケーションのシリアル化問題を解決するションです。これは 、複 数ファイル I P O

必要があります。十分なメモリーが利用可(Interprocedural Optimization) または能であれば、計算の前にメモリーにデープログラム全体の最適化 ( WPO: Whole

タを読み込むことで同じデータを使用しProgram Optimization) とも呼ばれます。

て後の計算をスピードアップできますが、

このオプションを指定すると、コンパイ

uniprot_trembl.fasta データファイルを

ラーは別々のファイル内で定義されてい使用するとマシンのメモリー容量をオーる関数への呼び出しについて関数のインバーしてしまうため、この方法は現実的でライン展開を実行します。

はありません。

オプ

インテル® コンパイラーがループをベク

さらなるパフォーマンスの向上は、イトル化または並列化するために何を行う

ンテル® コンパイラーのオプションを活用べきか調べるには、オブジェクトや実行17に分けられます。
hmmsearch でこのオプションを使用した後のアドバイスを次に示します。

esl _ vectorops.c(161):
リマーク #30536:(LOOP) 必要に応じて、-farg u m ent-noalias オ
プ ション を 追 加 して コンパ イラ ーに よる 型 ベ ース の 一 義 化 解 析 を
向 上 で きま す ( オ プ ション は コン
パ イル 全 体 に 適 用 さ れ ま す ) 。
これにより、行 161 のループがベクトル化され最適化が向上します。

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

PARALLEL UNIVERSE–parallel オプションを追加すると、インテル® コンパイラーもできます。インテル® VTune™ Amplifier XE は、収集したデータで調は並列に実行できる可能性のある単純な構造のループを検出し査すべきパフォーマンス問題が含まれる部分を強調して表示します。
hmmsearch を実行した例を示します。(図 21)て、そのループのマルチスレッド・コードを自動的に生成します。ガイド付き自動並列化オプションを –parallel とともに使用すると、さらなる並列化が推奨されることがあります。
msvfilter.c(106): リマーク #30525:(PAR)"#pragma loop count min(1024)" 文をループの直前 (行 106) に挿入して、このループを並列化します。[確認] ループの反復回数が 1024 以上であることを確認して
ください。

まとめ

インテル® ソフトウェア開発ツールは、アプリケーションのパフォーマンスを向上し、ハイパフォーマンス・コンピューティングとエンタープラ
イズ・アプリケーションで必要とされるコードの品質、セキュリティー、信頼性を高められるように開発者を支援します。インテル® C コンパ
イラーおよびライブラリーはより高速なコードを生成し、インテル®
VTune™ Amplifier XE はボトルネックを検出し、インテル® Inspector
XE はエラーが発生する前にメモリーエラーとスレッドエラーを正確にインテル® VTune™ Amplifier XE のハードウェア・イベント・カウ

特定します。最新世代のマルチコア・プロセッサーで HMMER のようなンター収集機能を使用して、パフォーマンスに影響を与えるアプ

アプリケーションを開発する場合、これらのツールはすべて不可欠なリケーション・コードのボトルネックについてアドバイスを得ることものといえるでしょう。

インテル® Advisor XE は並列化による生産性の向上をどのように支援しているのか
RAVI VEMURI
宇宙探検、油田 / 天然ガス調査、ハリウッド映画、軍事戦略に共通しているものは? モデリング、シミュレーション、
研究、絵コンテ、偵察などのフレーズが思い浮かんだことでしょう。これらはすべて、選択ミス、失敗、過失によるコストを削減するように意図されており、プロジェクトの成功と生産性の向上を支援します。
ソフトウェアの並列化も同様に、コードが並列化に適しているかを評価する並列性調査を行うことで利益が得られます。これまで、並列性調査を行うことができるツールは限られていましたが、インテル® Advisor XE 2013 の登場により、この状況は大きく変わりました。インテル® Advisor
XE は、インテル® Parallel Studio XE ツール・スイートの最新のコンポーネントです。
ソフトウェアの並列化は、コードが潜在的に不安定になり、リスクがあり、割高で、さらに複雑です。現在の試行錯誤ア
プローチは生産的ではなく、デッドエンドの高いリスクがあります。測定したデータ (例えば、hotspot) に基づいてコードの並列化を開始するのは 1 つの方法ですが、コードが適切にスケールされる場合もあれば、適切にスケールされな
い場合もあります。不適切な並列化による安定性問題はさらに潜在的で、コードが製品化されてしばらく経過した後に表面化するため、修正に多大な費用がかかります。
インテル® Advisor XE は、並列化可能なコード領域の特定を支援するように設計されており、並列化のパフォーマンス
(スケーラビリティー) と並列化可能なコード領域のコード /データ共有問題 (正当性) の調査に重点を置いています。
インテル® Advisor XE は、並列化のスケーラビリティーと正当性を調査するため、プログラム内の異なる領域をモデル化します。モデル化の結果から、(デッドエンドを回避するために) 並列化しないコード領域と、マルチコアのパ
フォーマンスを活用するために実際に並列化するコード領域を適切に判断できます。
この手法を使用すると、データ共有問題が発生する前に問題を修正することができます。正当性問題を修正した
後、並列化のためにコードを準備する場合にも、機能的に変更されていない正しい既存のテスト・フレームワークを使用してプログラムを検証できます。
並列化作業にインテル® Advisor XE を利用することにより、リスクが大幅に減り、より適切に並列化を行うことができます。このツールは、アーキテクトやシニアエンジニア
しか生産的な並列化ができない現在の状況を一変させ、ソフトウェア最適化の知識があるプログラマーであれば誰でも生産的な並列化が行えるようになります。
アプリケーションの可能性を知るのはとても楽しいことです。製品の詳細は、インテル® Advisor XE 製品ページ( 英語 )を参照してください。製品についてお気付きの点がありましたら、是非お知らせください。

18

PARALLEL UNIVERSE

ポインターチェッカー:範囲外のメモリーアクセスの迅速な検出テクニカル・コンサルティング・エンジニア Kittur Ganesh

この記事では、プログラムの検出が困難なバグを正確かつ容易に検出できる、
ポインターチェッカーと呼ばれる強力な新しい機能を紹介します。インテル® C++
Composer XE 2013 製品に含まれるこの機能は、コンパイラーに統合され、ビルドシステムにシームレスで強力な機能を追加します。その優れた実装とエラー報
告機能は、プログラムの潜在的な問題に関する正確な情報を提供します。この新しい機能のベータテスト中に、多くのユーザーから、このツールで多数の問題が発見できたというフィードバックが寄せられたことを非常にうれしく思います。
C/C++ ポインターのセマンティクスが適切に定義されている場合でも、多くのアプリケーションは範囲外のメモリー

ポインターの下限と上限が適切に定義されていても、言語 (つまりコンパイラー) によっては、パフォーマンスと速度の関係からアクセスを行うことがあります。これらのアクセスは検出できな範囲チェックを行いません。その結果、アプリケーションのさまざ

いため、データが破壊されたり、脆弱性を利用した悪意のある攻撃を受ける可能性が高くなります。ポインターチェッカーは、ポイ

まな部分における (データ破壊、不安定なプログラムの動作、シス
テム・セキュリティー問題などを引き起こす) 潜在的なバッファー・

ンターによるすべてのメモリーアクセスを完全にチェックして、メオーバーフローやバッファー・オーバーランが発生したり、多くのモリーが破壊される前に範囲外のメモリーアクセスをキャッチしソフトウェアの脆弱性を利用した悪意のある攻撃を受ける可能性ます。

が高くなります。

マルチコア・プロセッサーの出現により、データを頻繁に作成、格納、共有し、ポインターからメモリーにアクセスする、データとスレッドの並列化をプログラムする必要が高まっています。C および C++ 言語ではポインターによるメモリーアクセスの適切なセマ
ンティクスが定義されますが、これらのポインターを制限なく使用することも可能です。その場合、メモリー中のユーザーデータのア

インテル® Parallel Studio XE 2013 の新機能であるポインター

チェッカーは、範囲チェック (ポインターによるすべてのメモリー
アクセスの完全なチェック) を行い、コード範囲外のアクセスを認識します。この記事では、アプリケーションでポインターチェッカーを使用できるように、ポインターチェッカーの概要と使用モ
デルについて説明します。

クセスや書き込みに対する保護は行われないため、ポインターで任意の操作が行われ、(故意でないデータの修正により結果がランダムに見える、プログラムで非常に検出が困難なエラーである)
検出できない範囲外 (OOB) のメモリーアクセスが発生します。

19

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

PARALLEL UNIVERSE

概要

ポインターチェッカーは、インテル® Parallel Studio XE 2013 の重要な機能です。ポインターチェッカーの主な機能は、Windows* または Linux* オペレーティング・システムの高水準言語 (C および C++)で開発されたアプリケーションで発生するバッファー・オーバーフ
ローとバッファー・オーバーランを検出することです。バッファー・
オーバーフローとバッファー・オーバーランは、プログラムがバッ
ファーにデータを書き込むときに、バッファーの範囲を超えて隣BLOG
highlights

接するメモリーに書き込みを行う、メモリー安全性違反の特別なケースです。例えば、図 1 のコードスニペットで示されるようなバッファーの配列を考えてみましょう。

char *buf = (char *)malloc(5);for (int i=0; i<=5;i++) {buf[i] = ‘A’ + i;}
図1

バッファー・オーバーフローは、配列が保持できる項目よりも多くの項目を配列に格納しようとした場合に発生します。通常、書き込みやストアで発生します。一方、バッファー・オーバーラ
ンは、配列の最後を過ぎても読み取りを続けた場合に発生します。通常、読み取りやロードで発生します。さらに、単純なコー
ディング・エラーは、多くの場合、検出や修正が非常に困難です。例えば、ポインターは void 型のポインターに一度キャストして型をマスクし、その後別の型にキャストして使用されることがよくあるため、アプリケーションでエラーの原因を特定することが非常に困難になります。前述したように、ポインターの下限と上限が適切に定義されていれば、ポインターチェッカーでポイン
ターによるすべてのメモリーアクセスの範囲チェックを行うこと
で、読み取りや書き込み操作で使用する前にポインターが範囲内にあることが保証されます。

アムダールの法則によるフラストレーションの 最小 化とチューニング効果の最大化
SHANNON CEPEDA
先日、アプリケーションの hotspot を最適化したのに思ったほどアプリケーション全体のパフォーマンスが向上しなかったというユーザーから質問がありました。
この質問は、パフォーマンス・チューニングの反復プロ
セス中によく寄せられます。通常は、2 つの理由のいず
れかによるものです。
1. ある領域を最適化したことで別の領域の効率が低下した。これはパフォーマンス・チューニングではよ
くあることで、プロセスが反復的である理由の 1 つです。ある関数のコードを変更するときに別の部分のパフォーマンスが低下するかどうか予想することは困難であるため、この状況が発生することは避けられません。この状況が発生することを完全に防ぐことはできないかもしれませんが、適切なドキュメ
ントとパフォーマンスの変更を測定できるインテル®
VTune™ Amplifier XE のようなツールを使用することにより、この状況がいつ発生しているかを確認することはできます...

ポインターチェッカーの機能は、コンパイラー・オプションを指定して有効にします。ポインターチェッカーを有効にしてアプ

リケーションをビルドすると、添字付き配列アクセスを含む、ア
プリケーションで発生するすべての範囲外メモリーアクセスが識別されレポートされます。ポインターチェッカーは、ダングリ
ング・ポインター ( 解放されたメモリーを指すポインター) を検出することもできます。ダングリング・ポインターの検出を有効にしてアプリケーションをビルドした場合、間接アクセスでダン

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

グリング・ポインターを使用しても範囲外エラーになります。ポインターチェッカーで提供されるもう 1 つの便利な機能は、無次元配列の範囲チェックです。この機能は、extern でデータを共有する複数の開発者により作成された多くの異なるモジュー
ルが統合されているアプリケーションで特に重要です。

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

20

PARALLEL UNIVERSE

インテル® (Visual)
Fortran Composer XEの新しい並列プログラミング機能
開発者向け製品部門

Steve Lionel

21

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

PARALLEL UNIVERSE

F o r t r a n プログラマー は 長 年 、自 動 並 列 化 、OpenMP*、MPI のような Fortran 規格にない手法を使用して並列プログラミングを行ってきました。2010 年後半にFORALL キーワードの後の括弧付きのリストは forall-ヘッダーと呼ばれ、インデックス名がとる値の範囲を指定する 1

つ以上の forall-トリプレットが含まれます。この例では、2 つ

国際規格として承認された Fortran 2008 で初めて、並列のインデックス名 I と J があり、それぞれ 1 から 10 の値をとプログラミングの手法として 2 つの言語機能が採用されました。(1 つの言語機能のみでは並列にできません。)

ることが指定されています。Fortran 90 の配列表記のように、この記事では、この 2 つの新機能、DO CONCURRENT とクリメントは 1 です。最後の部分は、FORALL 構文の本体 (2つの代入) が実行される条件を決定するマスク式です。

Co-Array の概要を説明します。前者は非常に容易に理解できますが、後者は容易ではありません。

DO CONCURRENT

トリプレットの 3 番目の要素で指定されていない場合、イン

多くの Fortran プログラマーは、FORALL のループ (このケースでは 2 つの入れ子のループ ) を目にしたとき、式がfalse だった場合、次の反復にスキップすると考えるでしょう。しかし、FORALL はループ構文ではなく、「マスク配列の1990 年代初めに、ハイパフォーマンス・コンピューティン

代入」です。ループとして見なせるのであれば、各反復で両グおよび並列処理用に Fortran 90 言語を拡張する試みが行われました。High Performance Fortran ( HPF ) は、方の代入が実行され、代入を並列実行できるはずです。しか配列演算を並列に実行できるようにした手法を用いてすべての組み合わせで最初の代入が完全に実行され、マス

Fortran 90 の配列構文の構築を試みました。HPF では、

クでフィルターされます。次に、すべての組み合わせで 2 つFORALL および WHERE 構文、副作用のない PURE プロ

目の代入が完全に実行され、マスクでフィルターされます。

シージャー、スキャッター/ギャザーのような演算用の組込

FORALL 構文の内部で、関数が PURE の場合、代入文は関数

みプロシージャーが導入されました。HPF はあまり普及しを参照しますが、FORALL に、代入文、WHERE 構文、ほかのませんでしたが、その一部の機能は 1997 年に承認された

FORALL 以外の文を記述することはできません。

Fortran 95 規格で採用されました。
さまざまな HPF 機能のうち、FORALL ほど誤解されたものはないでしょう。FORALL 構文の例を次に示します。

し、FORALL の定義は異なります。まず、全インデックス名のFORALL は貴重な試みでしたが、並列に代入を行うための規則に制限が多かったため、Fortran コミュニティーに広く受け入れられることはありませんでした。その結果、Fortran2008 では、FORALL の改良ともいえる DO CONCURRENT が導入されました。

REAL ::A(10, 10), B(10, 10) = 1.0…
FORALL (I = 1:10, J = 1:10, B(I, J) /= 0)A(I, J) = REAL(I + J + 2)
B(I, J) = A(I, J) + B(I, J) * REAL(I * J)
END FORALL

DO CONCURRENT 構文は、DO と FORALL の組み合わせのように見えます。実は、DO CONCURRENT の先頭は FORALL
ヘッダー構文を使用しています。次に例を示します。

DO CONCURRENT (I=1:N)
T = A(I) + B(I)C(I) = T + SQRT(T)
END DO

22

PARALLEL UNIVERSEFORALL と同様に、マスクはオプションです。
マスクが指定された

Co-Array はアプリケーションのすべてのイメージで分割され、各場合、マスク式が true であるもののみに、インデックス名のアクティ
ブな組み合わせのセットが減らされます。FORALL と異なり、DO

Co-Array の部分は個々のイメージのローカルメモリーに格納されます。このプロパティーは PGAS (Partitioned Global Address Space)

CONCURRENT の範囲はそれぞれが反復で、すべてのアクティブなイ

並列プログラミングの概念と関連付けられます。ここで、Co-Array

ンデックスの組み合わせで個別に実行されます。

は共有「アドレス空間」に存在しますが、イメージ固有のセグメント

DO CONCURRENT にもいくつかの制限があります。例えば、構文外は個々にアドレス可能です。単純な例を見てみましょう。

への RETURN や GO TO はできません。また、別の反復で定義された変数、または未定義にされた変数は参照できません。ある反復で書き込んだレコードを別の反復で読み取らない限り、DO CONCURRENT

real, dimension(10,20), codimension[*] ::A

で I/O 処理を行うことができます。FORALL と同様に、構文内から呼び出されるプロシージャーは PURE (副作用がない) でなければなり

配列 A を次元 10x20 と 1 つの codimension で定義します。

ません。ループ間に依存性がないことを保証するのはプログラマー

codimension を追加の次元と見なすと良いでしょう。ちなみに、の責任です。コンパイラーは依存性を確認しません。
DO CONCURRENT はインテル® [ Visual ] Fortran Composer

Fortran 規格では次元と codimension の合計は 15 に制限されてい)ます。(インテル® Fortran では拡張して 31 までサポートしています。

XE 2011 でサポートされ、自動並列化 (/Qparallel または-parallel) を有効にすると、コンパイラーは構文を並列にcodimension の最後の上限 cobound は * でなければなりません。

実行しようとします。しかし、DO CONCURRENT が並列実行さがある場合、A の cobound は 1:8 です。

* は実行時にはイメージの数を示します。実行時に 8 つのイメージれる保証はなく、反復が実行される順序は予測できません。

次元と同様に、下限と上限を含む複数の codimension を使用でプログラマーによりループ伝播の依存性がないことが保証されてき、最後の 1 つのみ上限として * を含めることができます。次のよいるため、DO CONCURRENT の使用は自動ベクトル化も助けます。

うになります。

Co-Arrayinteger, codimension[4,2:6,3:*]::B

MPI プログラマーの方は、データを収集し、MPI_SEND で収集したデータを別の「ノード」で実行しているプログラムのコピーに送り、

Co-Array は、角括弧で指定する coindex を使用しても、しな

MPI_RECV を使用して結果を戻すという基本的な操作をご存知でしょう。(もちろん、この例はかなり単純化されています。) 標準のくても参照することができます。coindex を使用しない場合は、

Fortran 構文を使用してプログラムの別のコピーを操作でき、デーは、参照するイメージの coindex を指定します。

タを移動する呼び出しを追加する心配をしなくてもいいのであれ
ば、この処理は非常に楽になります。

Co-Array のイメージの部分を参照します。coindex を使用する場合
coindex に必要な数のイメージがない場合はどうなるのでしょうか? 通常の配列ではエラーになりますが、それとは異なり、

Co-Array Fortran は、1990 年代に Fortran 90 の拡張として最初

Co-Array の「形状」は規則正しくありません。上記の例 B の場合、に提唱され、以前は F- - (F マイナスマイナス) と呼ばれていました。

Co-Array の各「レイヤー」を満たすには 20 イメージ必要です。39 イ
メージある場合、coindex は [4,6,4] ではなく [3,6,4] です。(FortranCo-Array Fortran は、Fortran プログラムに並列処理を実装する
単純な構文を提供します。(定義と実装は単純ではありませんが、)2000 年代初めには Cray により T3E および X1
構文は単純です。

は左の添え字が最も速く変化する列優先順で処理を行うことに注意してください。)

スーパーコンピューター向けに実装され、多少の変更が加えられたイメージの数、イメージのインデックス、Co-Array の cobound は

後、Fortran 2008 規格に採用されました。インテルは、インテル®

組込みプロシージャーを使用して調べることができます。

[Visual] Composer XE 2011 Linux* 版および Windows* 版で、メイン

Co-Array の利点は、Fortran 言語に完全に統合されているこストリーム・コンピューター向けに Fortran 2008 の Co-Array を最とです。次のように、通常の変数が使用できるほとんどの場所で初に完全実装したバージョンをリリースしました。

Co-Array を使用することができます。

Co-Array Fortran の基本的な概念を次に示します。
> イメージ: アプリケーションの複数のコピーが並列に実行されます。コピーはそれぞれイメージと呼ばれます。

> プロシージャー呼び出しの引数> Co-Array: CODIMENSION 属性が指定されると、変数は Co-

Co-Array を使用するプログラムが見やすいのはこのためです。

Array になります。多少混乱するかもしれませんが、スカ

例えば、問題をデータのブロックに分割する Jacobian ソルバーを

ラーも Co-Array になります。規格では Co-Array を非ゼロの考えてみましょう。ほとんどの計算にイメージのローカルブロック

corank を含むエンティティーとして定義しており、スカラーでが含まれ、各ブロックの端で、隣接するイメージのチャンクの端にも配列でもかまいません。codimension (および coindex) はある「halo セル」からの値を考慮する必要があります。このようなコードに Co-Array を使用した場合の例を次に示します。(図 1)

角括弧 [] で表示されます。

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

PARALLEL UNIVERSE「インテル® [Visual] Fortran Composer XE は、単一システムで実行する 共有メモリー モードで Co-Array をサポートします。
–coarray ( または /Qcoarray) コンパイラー・オプションを追加
して Co-Array プログラムをビルドし、生成された実行ファイル
をそのまま実行できます。特別な設定は必要ありません。」
my_subgrid( 0, 1:my_M) = my_subgrid( my_N, 1:my_M)[my_north_P,me_Q]
my_subgrid( my_N+1, 1:my_M) = my_subgrid( 1, 1:my_M)[my_south_P,me_Q]
my_subgrid( 1:my_N, my_M+1) = my_subgrid( 1:my_N, 1 )[me_P, my_east_Q]
my_subgrid( 1:my_N, 0 ) = my_subgrid( 1:my_N, my_M )[me_P, my_west_Q]
図1

Fortran は、プログラミングが容易になるように追加の Co-Arrayの動作を定義します。次に例を示します。
> すべてのイメージが Co-Array を一貫して完全に割り当てるようにするため、すべての割り当てが同期ポイントの ALLOCATABLE
Co-Array にすることができます (実際、最も一般的な使用法
です)。

> すべてのイメージが I/O を行えます。通常は、各イメージに個別のユニット番号がありますが、すべてのイメージで「標準出力」(ユニット 6) があらかじめ接続されます。他の実装では「ストリームをマージする」必要はありませんが、インテル® Fortranはストリームをマージするため、すべての標準出力はイメージが実行されるコンソールに表示されます。
「標準入力」(ユニット 5) はイメージ 1 にのみあらかじめ接続されます。

> すべてのイメージには、最初と最後に暗黙の同期ポイントがあります。

イメージ間を同期する方法はいくつかあります。SYNC ALL 文はす
べてのイメージが同じ回数の SYNC ALL を実行するまで待機します。
SYNC MEMORY は、継続する前にメモリーの更新がすべて完了していることを確認します。SYNC IMAGES は SYNC ALL に似ていますが、指定したセットのイメージに同期を制限します。
組込みモジュール ISO_FORTRAN_ENV で定義された LOCK_TYPE
を使用して宣言し、LOCK および UNLOCK 操作を行うロックもあります。また、ATOMIC_DEFINE および ATOMIC_REF 組込みプロシー
ジャーで整数および論理変数のアトミックな (中断されない) 読み取
りと書き込みを行うこともできます (インテル® Fortran Composer XE
2013 で新しくサポートされました)。

インテル® [ Visual ] Fortran Composer XE は、単一システムで実行する 共有メモリー モードで Co-Array をサポートします。
–coarray (または /Qcoarray) コンパイラー・オプションを追加して Co-Array プログラムをビルドし、生成された実行ファイ
ルをそのまま実行できます。特別な設定は必要ありません。クラス
ターで「分散メモリー」モデルのサポートを追加するには、(クラスターの構築に加えて) インテル® Cluster Studio のライセンスが必要です。Windows* クラスターの場合も同様です。(Windows* における分散メモリー Co-Array アプリケーションのサポートは、インテル®
Visual Fortran Composer XE 2011 Update 6 で追加されました)。
Co-Array および DO CONCURRENT を含む Fortran 2008 規
格の詳細は、Fortran 言語標準委員会のドキュメントを参照してください。
次の FORTRAN 規格のCO-ARRAY (英語)FORTRAN 2008 の
新機能 (英語)FORTRAN 2008 規格 (英語)24

PARALLEL UNIVERSE

インテル® マス・カーネル・ライブラリー(インテル® MKL) とインテル® コンパイラー
を使用し、実行するたびに数値再現性のある結果を取得
テクニカル・コンサルティング・マネージャー、インテル® マス・カーネル・ライブラリー
マネージャー、インテル® MKL テクニカル・ストラテジー Shane Story

Todd Rosenquist

ハリウッドからウォールストリートに至るまで、浮動小数点演算を行うすべてのアプリケーションは、優れたパフォーマンスと、実行するたびに完全に同じになる結果、つまり再現性のある結果の提供という課題に長い間直面してきました。再現性のある結果が得られない主な要因は浮動小数点演算の非結合性によるものですが、ランタイム、選択可能な最適化コードパス、非決定性スレッド化と並列処理、配列のアライメント、根本的なハードウェアの浮動小数点制御設定など、ほかの要因もあります。
この記事では、インテル® ソフトウェア開発ツールのユーザー向けにインテル® MKL とインテル® コンパ
イラーの機能を使用してパフォーマンスと再現性のある結果のバランスを取る方法を簡単に説明します。
インテル® Parallel Studio XE 2013 で追加された新しい数値再現性機能により、実行するたびに一貫した再現性のある結果を得ることができます。
インテル® ソフトウェア開発ツールの数値再現性機能
インテル® MKL 11.0

mkl_cbwr_set()
MKL_CBWR (環境変数)

インテル® Composer XE 2013

-fp-model または /fp
KMP_DETERMINISTIC_REDUCTION=yes

25

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

PARALLEL UNIVERSE

プロセッサーのクロックの上昇とともにソフトウェアのパ

フォーマンスが向上した時代が終わり、この数年間はクロックのレートはほとんど上昇しない代わりにマルチコア・システムが増加しています。マイクロプロセッサーの世代が新しくなるにつれ、ソフト
ウェアのパフォーマンスを高めるには、新しく追加された命令を使用してプロセッサーの性能を引き出すとともに、スレッド化アルゴリ
ズムを使用して多くの計算コアを活用することが必須となっています。この変化に遅れないために、多くの開発者がソフトウェア開発
ツールを活用しています。最適化コンパイラーは、命令およびデータ
レベルで並列化が可能で、プログラムで多くの計算を行う部分を自動的にスレッド化できます。ソフトウェア・ライブラリーは、コードをスレッド化するツールや高度に最適化されたスレッド化関数を呼び出すことにより自動的に並列化を行う手段を提供します。多くのソフ
トウェア・プログラマーは、これらのハイパフォーマンス・ツールを採用して、より優れたパフォーマンスを引き出しています。このとき、実行するたびに一貫しない結果が生成される可能性が高くなります。
次の 2 つのシナリオを考えてみましょう。アニメーション・スタジ「ハリウッドからウォールスト
リートに至るまで、 浮 動 小
数点演算を行うすべてのアプ
リケーションは、 優れたパフォーマンスと、実行するたびに完全に同じになる結果、
つまり再現性のある結果の提 供という課 題に長い間直面してきました。」

オのアーティストは、仮想世界でキャラクターを動かすことができる高度なモデリングツールを使用して毎日作業を行っています。こ

ここで、再現性問題についておさらいしておきましょう。この問題

れらのモデリングツールには、衣服、髪の毛、流動物の実世界におは、浮動小数点数の表現方法と、コンピューターで処理される順序ける動作をシミュレートできる物理エンジンが含まれており、科学によって、丸め誤差が発生することが原因です。IEEE 単精度またはアプリケーションや工学アプリケーションで使用されるものに似た

倍精度型2 で表現される一般的な浮動小数点数には、数学的な結浮動小数点モデルを使用します。正確さや精度を常に優先して考え

合プロパティーがない3 ことは周知の事実です。例えば、( a + b ) + c

る必要はありませんが、特にプロセスの初期段階では、同じ結果がは a + ( b + c ) と等しくない場合があります。

得られることが最も重要です。アーティストが数秒のシーケンスを特定の例について考えてみましょう。紙に鉛筆で書いた場合、2-63

実行するたびに衣服の軌跡が少しずつ異なる場合、アーティストは+ 1 + -1 = 2-63 です。ところが、倍精度浮動小数点数を使用してコン

創作プロセスをコントロールできず、シーンがさらなるレンダリング

ピューターでこの同じ計算を行った場合、(2-63 + 1) が 1 に丸められや後処理段階を経た後に、どの軌跡が使用されるのか定かではあて (2-63 + 1) + (-1) ≈ 1 + (-1) = 0 になります。演算の順序を多少変更りません。この問題は互いに影響する多くのモデルが含まれるシー

して、2-63 + (1 + (-1)) ≈ 2-63 + 0 = 2-63 にすることはできます。0 と 2-63

ンではさらに悪化し、全く予測できない結果につながります。

が等しくないのは明白であるため、演算の順序は丸め誤差がいつ

2 つめのシナリオは、オプションの価格設定からリスク分析まどのように発生するかだけでなく、最終的な計算結果にも影響しま

で、さまざまなアプリケーションのアルゴリズムを開発しているす。コンパイラーは通常、この順序の曖昧さを再連想と呼びます。

ウォールストリートの数学者についてです。この分野では、速く結

アプリケーション・レベルで並列化を行うと、再現性のない結果

果を得られることが (場合によっては巨額の) 収益につながります。

が生成される可能性がさらに高くなります。原因は、計算の引数がこれらのアルゴリズムを開発する「クォンツ」は、速く答えを得るこ指定される順序によってキャリーオーバーが発生するためです。作

とと、最も信頼性の高い答えを提供するために必要な、シミュレー業が複数のスレッドまたはプロセスに分配される場合は常に、計算

ション時間のバランス調整に日夜取り組んでいます。アルゴリズムが依存しているチェーン内で計算の順序を変更すると、中間結果だのパフォーマンスが向上すれば、同じ時間でより速い決定またはよけでなく、最終的な計算結果が異なる場合があります。配列の要素り優れた決定を下すことができるようになり、いずれかのケースでが複数のスレッドに分配されるときに、配列の合計や積をそのまま優位に立つことができます。しかし、これらのモデルの一部である

計算するリダクション演算が良い例です。一部の合計や積を計算

最適化された浮動小数点演算では、丸め誤差が発生することがあした後、複数のスレッドの値を組み合わせて 1 つの値にします。

ります。このため、初期の決定を検証するためにモデルを再度実行

配列の分配方法、あるいはスレッド固有の合計や積をほかの値としたときに、結果が以前と異なる可能性があります。プログラマー

組み合わせる順序を変更すると、最終的に導き出される合計や積が避けようとする不確実性は、後から疑問や問題になるものです。

に影響します。さらに範囲を広げると、一貫した予測可能な方法

これらは、インテル® MKL のユーザーがこの数年間に遭遇したさで並列処理を制御する方法は、決定性の並列処理4 の分野に含ま

まざまなシナリオ1 の 2 つにすぎません。インテル® MKL は、これれます。

まで 15 年以上にわたって多くのアプリケーション分野で使用され一般的なアプリケーションでは膨大な浮動小数点演算が行われてきた、高度に最適化された並列浮動小数点演算関数のライブラると考えた場合、計算の順序が最終的な計算結果にどのように影リーです。再現性のある結果が必要なアプリケーション・プログラ

響を与えるかは明らかです。

マーにとっては、これまで保証はなく、ライブラリーのシーケンシャ
ル・バージョンを実行するという制限付きのオプションが用意されているだけでした。
26

PARALLEL UNIVERSE

インテル® MKL

インテル® MKL 11.0 では、特定の条件の下で再現性のある浮動小数点演算結果を得ることができる「条件付き数値再現性」機能が追加されました。5 この新しい機能を使用すると、インテル®
MKL 関数は、実行するたびに同じ浮動小数点演算結果を返します。ただし、次のような制限があります。
> 関数呼び出しの入出力配列は、SSE/AVX1/AVX2 命令対応のシステムではそれぞれ、16/32/64 ビット境界でアライメン
トしなければなりません。

> 一貫した結果を得るには、すべての実行でスレッド数の制御が同じでなければなりません。

浮動小数点演算が行われる順序に影響する 1 つの実行プロ
グラム内のアプリケーション関連の要因には、ランタイム・プロ
セッサー・ディスパッチャーに基づくコードパスの選択、データ
配列のアライメント、スレッド数の変化、スレッド化アルゴリズ
ム、内部の浮動小数点制御設定などがあります。これまで、ユー
ザーがライブラリーのランタイム・ディスパッチや、関数が内部的にスレッド化されるかどうかを制御することはできませんでした。ただし、スレッド数の管理、浮動小数点設定の確認、メ「マイクロプロセッサーの世代
が新しくなるにつれ、ソフト
ウェアのパフォーマンスを向上させるには、新しく追加された命令を使用してプロセッ
サーの性能を引き出すとともに、スレッド化アルゴリズムを使用して多くの計算コアを活用することが必須となっています。」

モリーを割り当てるときにメモリーのアライメントを設定するス
テップを実行することは可能でした。
インテル® MKL は、アプリケーションに呼び出されたインテル® MKL 関数で走査する適切な内部コードパスを特定するために、ランタイム・プロセッサー・ディスパッチを行います。選択されるコードパスは、インテル® プロセッサーおよび互換プロセッ
サーの種類によって異なり、さまざまなレベルのパフォーマンス
が提供されます。例えば、インテル® Pentium® 4 プロセッサー上でインテル® MKL 関数を実行すると、SSE2 ベースのコードパスが実行されます。インテル® アドバンスト・ベクトル・エクステンション (インテル® AVX ) 対応の新しいインテル® Xeon® プロセッ
サー上では、同じライブラリー関数が AVX 命令を使用する異なるコードパスをディスパッチします。この違いは、各コードパスが実行しているプロセッサーで利用可能な機能を使うように最適化されているためです。この機能ベースの最適化アプローチ
は、その性質により、前述の再現性問題を増幅させます。内部浮

製品情報および購入情報は、インテル® ソフトウェア開発製品

動小数点演算が異なる順序で行われたり、関連付けが変更され

Web サイトを参照してください。

ると、計算結果は異なります。

http://www.intel.co.jp/jp/software/products/

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

PARALLEL UNIVERSE

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

28