この記事は、インテル® デベロッパー・ゾーンに公開されている「Benefits of Using Intel® Software Development Emulator」(https://software.intel.com/en-us/articles/benefits-of-using-intel-software-development-emulator) の日本語参考訳です。
この記事の PDF 版はこちらからご利用になれます。
はじめに
新しいインテル® プロセッサーには、アプリケーションのパフォーマンスを向上したり、セキュリティーを強化するための命令セット拡張が含まれます。インテル® アドバンスト・ベクトル・エクステンション (インテル® AVX)1 やインテル® AVX21 のような命令セット拡張によりパフォーマンスを向上し、インテル® Secure Hash Algorithm (インテル® SHA)2 命令により SHA を高速化することでアプリケーションのセキュリティーを向上できます。
これらの新しい命令が利用するハードウェアでサポートされていない場合、それらの命令を使用してアプリケーションを作成するにはどうしたらよいでしょうか? あるいは、新しい命令によりアプリケーションのパフォーマンスが向上することを保証し、それらの命令をサポートする新しいシステムの導入を正当化するにはどうしたらよいでしょうか?
インテル® Software Development Emulator (インテル® SDE) を利用することで、新しい命令をサポートしていないシステムで、それらの命令を使用するアプリケーションを実行できます。
この記事では、インテル® SDE を利用して新しい命令を使用するコードをテストする利点について述べます。
インテル® Software Development Emulator (インテル® SDE) とは?
その名のとおり、インテル® SDE は、新しい命令セットを使用するコードをそれらの命令をサポートしないシステムで実行できるようにするエミュレーターです。インテル® SDE の詳細は、[3] を参照してください。インテル® SDE は、機能の評価には役立ちますが、ネイティブ・ハードウェアよりも遅い速度でプログラムを複数回実行するため、パフォーマンスの評価には適していません。インテル® SDE はこちら (英語) からダウンロードできます。
インテル® SDE を利用して新しい命令セットを使用するアプリケーションをテストするには、それらの命令をサポートする適切なコンパイラーでアプリケーションをコンパイルする必要があります。例えば、インテル® AVX2 命令を使用するアプリケーションは、インテル® コンパイラー 14.0 以上、gcc 4.7 以上、または Microsoft* Visual Studio* でコンパイルします。インテル® SDE は、すべての命令をアセンブリー言語で表示します。ユーザー・アプリケーションの命令だけでなく、ライブラリーやカーネルの命令も表示します。
インテル® SDE オプションの一覧を表示するには、コマンドプロンプトで次のコマンドを実行します。
sde –help
図 1. インテル® SDE オプションの一覧
詳細なインテル® SDE オプションの一覧を表示するには、次のコマンドを実行します。
sde -help -long
インテル® SDE を使用する
ここでは、よく使用される 2 つのインテル® SDE オプションの使用法を説明します。インテル® SDE のダウンロード場所、インストールおよび実行方法については、[4] にある動画をご覧ください。
mix
図 2. mix オプション
図 2 は、mix オプションとその出力ファイルに関する説明です。"-mix" オプションと "-omix" オプションは、実行されたすべての動的な命令とその長さ、カテゴリー、ISA 拡張グループを表示します。このオプションを指定してインテル® SDE を実行するには、コマンドプロンプトで次のコマンドを実行します。
sde.exe -mix — <アプリケーション名>
mix.out という名前のファイルに結果が出力されます。出力ファイル名を指定して実行するには、次のコマンドを使用します。
sde.exe –omix <ユーザー定義の出力ファイル名> — <アプリケーション名>
ast
図 3. ast オプション
図 3 は、ast オプションとその出力ファイルに関する説明です。"-ast" オプションまたは "-oast" オプションは、インテル® SSE 命令とインテル® AVX/インテル® AVX2 命令の切り替えを検出します。この切り替えには多くの実行サイクルがかかるため、このオプションは非常に便利です。命令の切り替えを減らすことで、アプリケーションのパフォーマンスを向上できます。このオプションを指定してインテル® SDE を実行するには、コマンドプロンプトで次のコマンドを実行します。
sde.exe -ast — <アプリケーション名>
avx-sse-transition.out という名前のファイルに結果が出力されます。出力ファイル名を指定して実行するには、次のコマンドを使用します。
sde.exe -oast <ユーザー定義の出力ファイル名> — <アプリケーション名>
注: 次のように、複数のオプションを 1 つのコマンドにまとめることもできます。
sde.exe -mix -ast — <アプリケーション名>
または
sde.exe –omix < mix 出力ファイル名> -oast < ast 出力ファイル名> — <アプリケーション名>
‘mix’ オプションの出力を理解する
mix オプションの出力ファイルには、さまざまな情報が含まれています。ここでは、すべてを取り上げることはできないため、特定の部分に注目して説明します。
図 4. この部分から、アプリケーション (linkpack_xeon64) で 28 スレッドが実行中であることが分かります。
図 5. スレッド 0 (TID 0) で使用された命令と命令タイプ (AVX、FMA、SSE) が分かります。
図 6. スレッドの最後に、スレッドで使用された命令とその回数が表示されます。
図 7. 出力ファイルの最後に、アプリケーションとアプケリーションで使用されたライブラリーのすべての命令が表示されます。
‘ast’ オプションの出力を理解する
ast オプションを指定してインテル® SDE を実行した結果は、インテル® SSE とインテル® AVX 間の切り替えを特定するのに役立ちます。
図 8. インテル® SSE-インテル®AVX とインテル® AVX-インテル® SSE の切り替えが行われていません。
インテル® SSE とインテル®AVX 間の切り替えには、多くの実行サイクルがかかります。場合によっては、20,000 サイクルにも達することがあります。そのため、この切り替えを減らすことが重要です。この切り替えがあった場合7、ast 出力ファイルは図 9 のようになります。
図 9. インテル® SSE-インテル®AVX とインテル® AVX-インテル® SSE の切り替えが行われています。
この切り替えペナルティーの回避方法については、[9] を参照してください。
インテル® SDE の利点
命令を検出する
インテル® SDE は、コードに含まれる命令 (静的) ではなく、アプリケーションの実行中に実行された命令 (動的) のみカウントします。これは、コードの特定の領域で特定の命令の実行が想定されるケースで問題があった場合に、アプリケーションをデバッグするのに役立ちます。コードの特定の領域に対応するアドレスブロックで想定される命令が検出されなかった場合、想定外/意識しない分岐などが発生したことを示します。インテル® SDE は、このような状況に対応するため、start-address や stop-address オプションを提供しています。これらのオプションは、ドキュメント化されていません。5 インテル® SDE の将来のリリースでドキュメント化される可能性があります。
ここで重要なことは、異なるオプションや入力でアプリケーションを実行すると、動作や動的実行が変わるため、1 回の実行ですべての情報を得ることはできません。常に、異なるワークロードでアプリケーションを実行し、動作を検証したほうが良いでしょう。
パフォーマンス向上の可能性
インテル® SDE は、インテル® SSE-インテル® AVX とインテル® AVX-インテル® SSE の切り替えを検出することができます。この切り替えを減らすことで、パフォーマンスを向上できる可能性があります。
不正なポインターと不適切なデータ・アライメントをチェックする
インテル® SDE には、不正なポインターと不適切なデータ・アライメントのチェック機能が備わっています。以下は、インテル® SDE ドキュメントから抜粋した、その 2 つの機能に関連するオプションの説明です。8
図 10. デバッグオプション
まとめ
インテル® SDE を利用することで、インテルの新しい命令セットをサポートするハードウェアがなくても、それらの命令を使用するアプリケーションをテストして、新しい命令や将来のプラットフォームにより利点が得られるかどうかを評価することができます。インテル® SDE の実行速度はネイティブ・プラットフォームと比較して非常に遅いため、将来のパフォーマンスの評価には適していません。インテル® SDE は、コードで使用されている命令ではなく、実行された命令を動的にカウントします。また、インテル® SSE-インテル® AVX とインテル® AVX-インテル® SSE の切り替えも検出します。これらの機能は、デバッグや最適化に役立てることができます。インテル® SDE は、不正なポインターや不適切なデータ・アライメントを検出するためのデバッグにも利用できます。ここでは、インテル® SDE の一部の機能について説明しました。「参考文献」セクションの記事をはじめとするドキュメントをお読みになり、その他の機能も利用してみてください。
参考文献
[1] http://en.wikipedia.org/wiki/Advanced_Vector_Extensions (英語) [2] http://en.wikipedia.org/wiki/Intel_SHA_extensions (英語) [3] https://software.intel.com/en-us/articles/intel-software-development-emulator (英語) [4] http://goparallel.sourceforge.net/installing-running-intel-software-development-emulator/ (英語) [5] https://software.intel.com/en-us/forums/topic/533825 [6] http://en.wikipedia.org/wiki/Intrinsic_function (英語) [7] https://software.intel.com/en-us/forums/topic/538142 [8] https://software.intel.com/en-us/articles/intel-software-development-emulator#BASIC (英語) [9] https://www.isus.jp/article/avx/avoiding-avx-sse-transition-penalties/著作権と商標について
本資料に掲載されている情報は、インテル製品の概要説明を目的としたものです。本資料は、明示されているか否かにかかわらず、また禁反言によるとよらずにかかわらず、いかなる知的財産権のライセンスを許諾するためのものではありません。製品に付属の売買契約書『Intel’s Terms and Conditions of Sale』に規定されている場合を除き、インテルはいかなる責任を負うものではなく、またインテル製品の販売や使用に関する明示または黙示の保証 (特定目的への適合性、商品適格性、あらゆる特許権、著作権、その他知的財産権の非侵害性への保証を含む) に関してもいかなる責任も負いません。インテルによる書面での合意がない限り、インテル製品は、その欠陥や故障によって人身事故が発生するようなアプリケーションでの使用を想定した設計は行われていません。インテル製品は、予告なく仕様や説明が変更される場合があります。機能または命令の一覧で「留保」または「未定義」と記されているものがありますが、その「機能が存在しない」あるいは「性質が留保付である」という状態を設計の前提にしないでください。これらの項目は、インテルが将来のために留保しているものです。インテルが将来これらの項目を定義したことにより、衝突が生じたり互換性が失われたりしても、インテルは一切責任を負いません。この情報は予告なく変更されることがあります。この情報だけに基づいて設計を最終的なものとしないでください。本資料で説明されている製品には、エラッタと呼ばれる設計上の不具合が含まれている可能性があり、公表されている仕様とは異なる動作をする場合があります。現在確認済みのエラッタについては、インテルまでお問い合わせください。最新の仕様をご希望の場合や製品をご注文の場合は、お近くのインテルの営業所または販売代理店にお問い合わせください。本資料で紹介されている資料番号付きのドキュメントや、インテルのその他の資料を入手するには、1-800-548-4725 (アメリカ合衆国) までご連絡いただくか、http://www.intel.com/design/literature.htm (英語) を参照してください。本資料に含まれるソフトウェア・ソース・コードはソフトウェア・ライセンス契約に基づいて提供されるものであり、その使用および複製はライセンス契約で定められた条件下でのみ許可されます。Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。© 2016 Intel Corporation.無断での引用、転載を禁じます。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。