インテル® Software Development Emulator

インテル® Software Development Emulator

この記事は、インテル® デベロッパー・ゾーンに掲載されている「Intel® Software Development Emulator」(https://software.intel.com/en-us/articles/intel-software-development-emulator) の日本語参考訳です。


概要

このエミュレーターは、インテル® Software Development Emulator または略してインテル® SDE と呼ばれます。

最新バージョン 8.35 は、2019 年 3 月 11 日にリリースされました。このバージョンは、https://software.intel.com/en-us/forums/intel-isa-extensions で公開されている「プログラマー・リファレンス 319433-035」に対応しています。インテル® SDE のリリースノートをご覧ください。これは、すでにリリースされているバージョンへのマイナー・アップデートです。

  • 将来のインテル® プロセッサーに搭載される追加のインテル® アドバンスト・ベクトル・エクステンション 512 (インテル® AVX-512) 命令セットのエミュレーションをサポート。
  • 次世代のインテル® プロセッサーに搭載されるディープラーニング向けのベクトル命令セットのエミュレーションをサポート。
  • 将来のインテル® プロセッサーでサポートされる Control-Flow Enforcement Technology (制御フロー強制テクノロジー) のエミュレーション。

インテル® SDE は、すでにリリース済みの機能を継続してサポートします。

  • インテル® ストリーミング SIMD 拡張命令 4 (インテル® SSE 4)、AES と PCLMULQDQ およびインテル® アドバンスト・ベクトル・エクステンション (インテル® AVX)
  • インテル® AVX2、RTM、BMI1 および BMI2 命令は、Haswell マイクロアーキテクチャーと呼ばれる第 4 世代インテル® Core™ プロセッサー・ファミリーで導入されました。
  • ADOX/ADCX 命令は、Broadwell マイクロアーキテクチャーと呼ばれる第 5 世代インテル® Core™ プロセッサー・ファミリーで導入されました。
  • Haswell マイクロアーキテクチャーと呼ばれる第 4 世代インテル® Core™ プロセッサー・ファミリーで導入された、ハードウェア・ロック省略 (HLE) のサポート。
  • Haswell マイクロアーキテクチャーと呼ばれる第 4 世代インテル® Core™ プロセッサー・ファミリーで導入された、制限付きトランザクション・メモリー (RTM) のサポート。
  • Goldmont マイクロアーキテクチャーと呼ばれる Intel Atom® プロセッサーで導入された、インテル® Secure Hash Algorithm (インテル® SHA) 拡張のサポート。

関連情報:

  • インテル® SHA 拡張の詳細については、https://software.intel.com/en-us/articles/intel-sha-extensions-implementations をご覧ください。サンプルのテスト・アプリケーションも含まれています。

このインテル® SDE を利用することで、開発者は今後リリースされる予定の命令セット拡張機能に精通できるようになります。インテル® SDE は、ソフトウェアがこれらの新しい命令によって生み出される可能性をプロセッサーで活用する準備が整っているかを確認するのに役立ちます。開発者が現在利用可能な最新のコンパイラーとアセンブラーを使用して、新しい命令の可能性を探索することを願っています。

インテル® SDE は、Pin ダイナミック・ライブラリー計測システム (英語) と XED エンコーダー/デコーダーを基に構成されています。Pin はアプリケーションの実行を制御します。Pin は実行トレースを構築する際に、アプリケーション内の命令セットを一度静的に調査します。インストルメンテーションと呼ばれるこの手順では、Pin は検出したそれぞれの命令をエミュレートするかインテル® SDE に問い合わせます。命令をエミュレートする場合、インテル® SDE は Pin にその命令をスキップして、代わりに該当するエミュレーション・ルーチンに分岐するように指示します。また、Pin に対しそのエミュレーション関数を呼び出す方法および引数などを指示します。

インテル® SDE はエミュレートする機能を特定するため CPUID を照合します。また、エミュレートされた機能をチェックするコンパイル済みアプリケーションに対し、それらが存在することを通知するため CPUID の出力を変更します。

インテル® SDE には、いくつかの有用なエミュレーター対応の Pin ツールと XED 逆アセンブラーが付属します。

  • 基本エミュレーター
  • 混合ヒストグラム・ツール: この Pin ツールは、動的な命令実行、命令長、命令のカテゴリー、および ISA 拡張グループによってヒストグラムを計算できます。また、最も頻繁に実行された基本ブロックの上位 N 個を表示して、それらを逆アセンブルすることができます。
  • デバッグトレース ASCII トレースツール: この多目的ツールは、コードの動的な振る舞いを観察するのに役立ちます。実行された命令、書き込まれたレジスター、読み書きされたメモリーなどを表示できます。
  • フットプリント・ツール: この単純なツールは、プログラムの実行中に参照された 64 バイトのデータチャンクをカウントします。
  • XED コマンドライン・ツールは、PECOFF または ELF バイナリー実行形式のファイルを逆アセンブルします。

インストール

プラットフォームに対応するキットをダウンロード (英語) して展開します。配置したディレクトリーを指すように PATH 環境変数を設定します。絶対パスまたは相対パスでキット内のツールを参照することもできます。展開されたキットのファイルやサブディレクトリーを変更しないでください。キットのディレクトリーを移動する場合、すべてのコンポ―ンメントを移動してください。

Windows*: WinZip* を使用する場合、展開されたファイルに適切な権限が与えられます。しかし、Cygwin* の tar コマンドを使用して Windows* キットを展開する場合、展開したキットに対し「chmod -R +x <キットへのパス>」コマンドを実行する必要があります。

Linux*: 一部の Linux* ディストリビューションでは、インテル® SDE が動作するように「SELinux」を無効にする必要があります。Ubuntu* システムでは、yama を無効にする必要があります

インテル® SDE は、MACH タスクポート API を使用します。デフォルトでは、この API が使用されると GUI セッションごとにユーザー認証が求められます。認証なしで PIN/SDE を実行するには、これを無効にする必要があります。これを行うには、以下で説明するように、プロセスの引き継ぎを自動確認するようにマシンを構成します。

インテル® SDE の実行

これはインテル® SDE を実行する典型的なパターンです。

&lt;キットへのパス&gt;/sde [sde args] -- user-application [app args]

二重ハイフン「–」は重要です。インテル® SDE へのオプションは、二重ハイフンの前に指定します。角弧「[ ]」はオプションの引数です。

オプションの使い方を見るには、ショートヘルプとロングヘルプを使用します。ショートヘルプを見るには次を指定します。

&lt;キットへのパス&gt;/sde -help

ロングヘルプを見るには以下を使用します。

&lt;キットへのパス&gt;/sde -long-help

ヘルプメッセージでは、コマンドライン・オプションは、単語の繋ぎにアンダーライン「_」を使用したり、ハイフン「-」を使用することもあります。多くの場合、インテル® SDE のヘルプメッセージやこの記事では、慣例的な背景からコマンドライン・オプションを「ノブ (knob)」と呼んでいます。ショート・ヘルプ・メッセージには、サポートされる CPU リストのほか、上位レベルの解析ツールのノブも含まれます。

注:
システムにウイルス保護ツールがインストールされている場合、インテル® SDE を実行すると一部のコンポーネントが保護される場合があります。その場合、インテル® SDE を保護から除外してください。

すべてをエミュレート・モード

  • Windows*: Windows* では、インテル® SDE の管理下で cmd.exe ウィンドウを実行する sde-win.bat というバッチファイルが用意されています。このバッチファイルのショートカットをデスクトップに置くこともできます。このウィンドウで起動されるすべてのバイナリーは、インテル® SDE の制御下で実行されるため、エミュレーションが行われなくても実行速度は遅くなる可能性があります。sde-win.bat では次のコマンドが実行されます。
    &lt;キットへのパス&gt;/sde -- cmd.exe
    
  • OS X* または Linux*: インテル® SDE 管理下で好みのシェルを実行できます。
    &lt;キットへのパス&gt;/sde -- /bin/tcsh
    

    このシェル配下で起動するものはすべて、インテル® SDE の管理下で実行されます。

ヒストグラム・ツールの実行

オペコード (XED iclass、デフォルト) または命令形式 (iform) によって、命令ミックス・ヒストグラムを生成します。バージョン 4.29 以降では、命令長と命令カテゴリーは常にヒストグラムに含まれるようになりました。

&lt;キットへのパス&gt;/sde -mix -- user-application [args] 
&lt;キットへのパス&gt;/sde -mix -iform -- user-application [args] 

注:

  • ISA 拡張ヒストグラムも常に計算され、ヒストグラムの先頭に星印が付いた行として表示されます。ISA 拡張には、BASE、X87、インテル® MMX®、インテル® SSE、インテル® SSE2、インテル® SSE3 … などがあります。これは、アプリケーションでどの命令セット拡張が使用されているか知るのに役立ちます。
  • 動的統計は、いくつかの方法で記録および出力されます: (1) スレッドごと、(2) スレッドごとの関数ごと、および (3) 実行全体の合計。アプリケーションのシンボル情報が用意されている場合、関数ごとの命令数も提供されます。
  • 出力は、作業ディレクトリーの sde-mix-out.txt というファイルに書き込まれます。出力ファイル名は、-omix オプションで変更できます。
    &lt;キットへのパス&gt;/sde -mix -omix foo.out -- user-application [args]
    
  • 上位 20 個の基本ブロックは、常に実行の重み情報とともに出力されます。
  • 「-top_blocks N」オプションを使用して、上位 20 個を N 個に変更できます。
  • iforms: 「iform」は、命令の別名を示す XED の用語です。単純な命令では、それらは reg/reg や reg/mem になりますが、実際にはもっと複雑です。iform 名は XED に由来します。これは実験的な意味合いもあり、将来変更される可能性もあります。さらに詳しい iform によるヒストグラムを見るには、-iform コマンドライン・オプションを使用します。
  • mix ツールには多くのコマンドライン・オプションがあります。
Mix ノブ

-d  [デフォルト 0]
    動的プロファイルのみ収集します。
-demangle  [デフォルト 1]
    シンボルの名前修飾の読み取りを制御します。
-disas  [デフォルト 0]
    上位ブロックの逆アセンブリーを表示します。
-disas_at_jit  [デフォルト 0]
    このノブは何も行いません (非推奨)。
-dynamic_stats_per_block  [デフォルト 0]
    ブロックごとに動的統計を表示します。
-dynamic_stats_per_loop  [デフォルト 0]
    ループごとに動的統計を表示します。
-function_call_counts  [デフォルト 1]
    関数が呼び出された回数を収集します。
-global_functions  [デフォルト 1]
    グローバル関数レポートを表示します。
-global_hot_blocks  [デフォルト 1]
    グローバル・ホット・ブロックを表示します。
-hottest_threads_order  [デフォルト 0]
    スレッド統計を Icount ごとに表示します。
-iform  [デフォルト 0]
    ISA iform ミックスを計算します。
-line_info  [デフォルト 1]
    上位のホットなブロックに行番号を追加します。
-map_all_blocks  [デフォルト 0]
    上位ブロックだけではなくすべてのブロックをマップします。
-mapaddr  [デフォルト 0]
    マッピングを出力します: アドレス  -&gt; ソースファイルと行番号。
-mapaddr_top_blocks  [デフォルト 0]
    上位ブロックのマッピングを出力します: アドレス  -&gt; ソースファイルと行番号。
-mix  [デフォルト 0]
    ミックス・ヒストグラム計算します。
-mix_concat_bbls  [デフォルト 0]
    連続するブロック統計を結合します。
-mix_filter_no_shared_libs  [default ]
    共有ライブラリーをインストルメントしません。
-mix_filter_rtn
    インストルメントするルーチンを指定します。
-mix_loops  [デフォルト 0]
    ループ統計を生成します。
-mix_loops_threads  [デフォルト 1]
    スレッドごとのループ統計を生成します。
-mix_max_cumulative  [default 97]
    累積の最大数を指定し、最大累積数に到達したら関数の表示を停止します。
-mix_omit_per_function_stats  [デフォルト 0]
    関数ごとのヒストグラムを省略して、出力ファイルのサイズを減らします。
-mix_omit_per_thread_stats  [デフォルト 0]
    スレッドごとの統計を省略して、出力ファイルを小さくします。
-mix_opt_report  [デフォルト 0]
    ミックスファイルに最適化レポートを追加します。
-mix_top_loops  [default 10]
    統計を出力する反復数でソートされた上位ループの最大数を指定します。
-mix_verbose  [デフォルト 0]
    ミックスファイルに情報メッセージを追加します。
-mix_vpconflict  [デフォルト 0]
    ミックスファイルに vconflic 統計を追加します。
-no_shared_libs  [デフォルト 0]
    共有ライブラリーをインストルメントしません。
-omix  [default sde-mix-out.txt]
    プロファイル・ファイル名を指定します。
-s  [デフォルト 0]
    main イメージの静的プロファイルの収集後に終了します。
-top_blocks  [default 20]
    icount を表示する上位ループの最大数を指定します。

コマンド:

    % sde -mix -- mm_cmp.opt.vec.exe

出力: sde-mix-out.txt (デフォルトのファイル名)

    #
    # $global-dynamic-counts
    #
    # opcode count
    #
    *isa-ext-BASE   147597
    *isa-ext-MODE64    222
    *isa-ext-SSE        21
    ADD               3092
    AND               2694
    CALL_NEAR         1739
    CDQE                 3
    CLD                 35
    CMOVB              800
    CMOVBE               6
    ...
    UCOMISS             14
    XCHG                 1
    XOR               4981
    ...
    *total          147840

ミックス集計

ミックス出力ヒストグラムの行には 2 つの種類があります。「*」で始まる行は、さまざまな方法で集計されたデータのメタカテゴリーです。以下にメタカテゴリーの説明を示します。

*scalar-simd: インテル® AVX とインテル® SSE 操作を含む、XED_ATTRIBUTE_SIMD_SCALAR 属性を持つすべての命令。単一のベクトル要素を操作する iclass 名が SS または SD で終わる命令は、この属性を持ちます。
*sse-scalar: XED_ATTRIBUTE_SIMD_SCALAR 属性を持つすべてのインテル® SSE 命令
*sse-packed: XED_ATTRIBUTE_SIMD_SCALAR 属性を持たないすべてのインテル® SSE 命令
*avx-scalar: XED_ATTRIBUTE_SIMD_SCALAR 属性を持つすべてのインテル® AVX 命令
*avx128: XED_ATTRIBUTE_SIMD_SCALAR 属性を持たない 128 ビット・ベクトル長のすべてのインテル® AVX 命令
*avx256: 256 ビット・ベクトル長のすべてのインテル® AVX 命令
*avx512: 512 ビット・ベクトル長のすべてのインテル® AVX 命令
*mem-atomic: アトミックなメモリー操作
*stack-read: スタックリード
*stack-write: スタックライト
*iprel-read: IP 相対メモリーリード
*iprel-write: IP 相対メモリーライト
*mem-read-1: メモリーリード、1 バイト
*mem-read-2: メモリーリード、2 バイト
*mem-read-4: メモリーリード、4 バイト
*mem-read-8: メモリーリード、8 バイト
*mem-write-1: メモリーライト、1 バイト
*mem-write-2: メモリーライト、2 バイト
*mem-write-4: メモリーライト、4 バイト
*mem-write-8: メモリーライト、8 バイト
*isa-ext-BASE: “BASE” ISA 拡張 (命令の汎用グループ。Base には各種の古い命令が含まれます)
*isa-ext-LONGMODE: インテル® 64 で追加された一連の命令 (32 ビットまたは 64 ビット命令)
*isa-set-I186: ISA “set” は、BASE ISA 拡張命令の分類。I186 には、80186 プロセッサーで導入された命令が含まれます。
*isa-set-I386: ISA “set” は、BASE ISA 拡張命令の分類。I386 には、80386 プロセッサーで導入された命令が含まれます。
*isa-set-I486REAL: ISA “set” は、BASE ISA 拡張命令の分類。I486REAL には、80486 プロセッサーで導入され、REAL モードで有効な命令が含まれます。
*isa-set-I86: ISA “set” は、BASE ISA 拡張命令の分類。I86 には、8086 プロセッサーで導入された命令が含まれます。
*isa-set-LONGMODE: ISA “set” は、LONGMODE ISA 拡張命令の分類。LONGMODE には、インテル® 64 モードで導入された命令が含まれます。
*isa-set-PENTIUMREAL: ISA “set” は、BASE ISA 拡張命令の分類。PENTIUMREAL には、インテル® Pentium® プロセッサーで導入され、REAL モードで有効な命令が含まれます。
*isa-set-PPRO: ISA “set” は、BASE ISA 拡張命令の分類。PPRO には、インテル® Pentium® Pro プロセッサーで導入された命令が含まれます。
*lock_prefix: 0xF0 LOCK プリフィクス付き命令
*rep_prefix: 0xF3 REP プリフィクス付き命令
*repne_prefix: 0xF2 REPNE プリフィクス付き命令
*osz_prefix: 0x66 プリフィクス付き命令
*rex_prefix: REX プリフィクス付き命令 (次の 4 つのケースを含みます)。REX プリフィクスは、次の 4 ビットを設定しなくとも使用できます。
*rexw_prefix: REX.W ビットが設定された REX プリフィクスを持つ命令
*rexr_prefix: REX.R ビットが設定された REX プリフィクスを持つ命令
*rexx_prefix: REX.X ビットが設定された REX プリフィクスを持つ命令
*rexb_prefix: REX.B ビットが設定された REX プリフィクスを持つ命令
*one-memops: 1 つのメモリー操作を行う命令
*two-memops: 2 つのメモリー操作を行う命令
*disp_only: ベースレジスターやインデックス・レジスターを使用せずに、ディスプレースメントのみでアドレス指定するメモリー操作を行う命令
*base_index: ベースレジスターやインデックス・レジスターを使用して、ディスプレースメントなしでアドレス指定するメモリー操作を行う命令
*base_index_disp: ベースレジスター、インデックス・レジスター、およびディスプレースメントを使用してアドレス指定するメモリー操作を行う命令
*scale_1: インデックス・レジスター scale=1 の命令数
*scale_2: インデックス・レジスター scale=2 の命令数
*scale_4: インデックス・レジスター scale=4 の命令数
*scale_8: インデックス・レジスター scale=8 の命令数
*memdisp8: 8 ビット・ディスプレースメントを持つメモリー操作
*memdisp32: 32 ビット・ディスプレースメントを持つメモリー操作

不正ポインターとデータのミス・アライメントの確認

新しいコードを起動する際に生じる一般的なエラーとして次の 2 つがあります。(1) 無効なポインターによる参照 (NULL ポインターやアクセスできないメモリー領域の参照)、および (2) データアクセスのミス・アライメント。インテル® SDE には、プログラム内でこれらを識別する機能があります。

ポインターチェッカーには次のオプションがあります。

-null_check  [デフォルト 0]
        メモリーオペランドの NULL 参照をチェックします。
-null_check_out  [デフォルト sde-null-check.out.txt]
        -null-check の出力ファイル名。
-ptr_breakpoint  [デフォルト 0]
        ポインターチェッカーにエラー発生時、アプリケーションのブレークポイントを通知させます。
-ptr_check  [デフォルト 0]
        ワイルド・ポインターチェッカー: メモリーオペランドのアクセシビリティーをチェックします。
-ptr_check_out  [デフォルト sde-ptr-check.out.txt]
        -ptr-check の出力ファイル名。
-ptr_check_warn  [デフォルト 0]
        ポインターチェッカーにエラーを警告させます。デフォルトはエラーで終了します。
-ptr_raise  [デフォルト 0]
        エラー発生時、ポインターチェッカーに例外を発生させます。
        デフォルトは解析ルーチンでエラーが無視されるように PIN_SafeCopy をオンにします。

アライメント・チェッカーは、プログラムを通じてデータのアライメントをプロファイルし、アライメントされていないデータアクセスの時間および位置情報を提供します。

-align_checker  [デフォルト normal]
        アライメントされていないメモリーアクセスのミックスをチェックします。
        assert、warn、report、normal、または ignore を指定できます。
        また、アライメントを必要としないものも含め、すべての命令を監視する 
        assert-all、warn-all、および report-all も指定できます。
-align_checker_256b  [デフォルト 0]
        256 ビット (32 バイト) のメモリー参照のみをチェックするように指示します。
-align_checker_file  [デフォルト sde-align-checker-out.txt]
        アライメントされていないメモリーアクセスに関するメッセージのファイル名を指定します。
-align_checker_image  [デフォルト ]
        名前付きイメージの命令のみをチェックします。
-align_checker_prefetch  [デフォルト 1]
        1=プリフェッチをチェック、0=プリフェッチを無視。
-align_checker_stderr  [デフォルト 0]
        アライメントされていないデータ型に関するメッセージを標準エラー出力に書き込みます。
        disabled にすると、ファイルに出力されます。
-align_correct  [デフォルト 1]
        アライメント・チェッカーを 1=有効、0=無効に設定します。

ASCII トレースツールを実行

&lt;キットへのパス&gt;/sde -debugtrace -- user-application [args]

デフォルトで出力は、現在のディレクトリーの sde-debugtrace-out.txt というファイルに書き込まれます。多くのオプションがあります。Pin ツールのオプションを表示するには、’sde -debugtrace -thelp’ を実行します。命令によって変更されたレジスターとフラグが出力されます。また、リード/ライトされたメモリー値も出力されます。

    % sde -debugtrace -- il_aesdec.opt.vec.exe
    % cat sde-debugtrace-out.txt
    ...
    TID0: Read 7b5b5465_73745665_63746f72_5d53475d = *(UINT128*)0x7fffffffd500
    TID0: INS 0x000000400b13     AVX      &lt;strong&gt;vmovdqa xmm0, xmmword ptr [rsp+0x100]&lt;/strong&gt;
    TID0:   XMM0 := 7b5b5465_73745665_63746f72_5d53475d
    TID0:   XMM0 :=      1.62559e+286      1.23396e+171    (doubles)
    TID0:   XMM0 := 1.13882e+36 1.93584e+31 4.50904e+21 9.51515e+17    (floats)
    TID0: Read 48692853_68617929_5b477565_726f6e5d = *(UINT128*)0x7fffffffd510
    TID0: INS 0x000000400b1c     AVX      &lt;strong&gt;vmovdqa xmm1, xmmword ptr [rsp+0x110]&lt;/strong&gt;
    TID0:   XMM1 := 48692853_68617929_5b477565_726f6e5d
    TID0:   XMM1 :=       6.84853e+40      5.20343e+131    (doubles)
    TID0:   XMM1 :=   238753 4.25907e+24 5.61426e+16 4.74242e+30    (floats)
    TID0: INS 0x000000400b25     AVX      &lt;strong&gt;vaesdec xmm0, xmm0, xmm1&lt;/strong&gt;
    TID0:   XMM0 := 138ac342_faea2787_b58eb95e_b730392a
    TID0:   XMM0 :=      1.55269e-214      -1.02648e-50    (doubles)
    TID0:   XMM0 := 3.50286e-27 -6.079e+35 -1.06338e-06 -1.05037e-05    (floats)
    TID0: INS 0x000000400b2a     AVX      &lt;strong&gt;vmovdqa xmmword ptr [rsp+0x120], xmm0&lt;/strong&gt;
    TID0: Write *(UINT128*)0x7fffffffd520 = 138ac342_faea2787_b58eb95e_b730392a
    TID0: Read 138ac342_faea2787_b58eb95e_b730392a = *(UINT128*)0x7fffffffd520
    TID0: INS 0x000000400b33     AVX      &lt;strong&gt;vmovdqu xmm0, xmmword ptr [rsp+0x120]&lt;/strong&gt;
    TID0:   XMM0 := 138ac342_faea2787_b58eb95e_b730392a
    TID0:   XMM0 :=      1.55269e-214      -1.02648e-50    (doubles)
    TID0:   XMM0 := 3.50286e-27 -6.079e+35 -1.06338e-06 -1.05037e-05    (floats)
    TID0: INS 0x000000400b3c     BASE     &lt;strong&gt;lea rdi, ptr [r12+0x50bd40]&lt;/strong&gt;          | rdi = 0x50bd70
    TID0: INS 0x000000400b44     BASE     &lt;strong&gt;mov edx, 0x10&lt;/strong&gt;                        | rdx = 0x10
    TID0: INS 0x000000400b49     BASE     &lt;strong&gt;lea rsi, ptr [rsp+0xf0]&lt;/strong&gt;              | rsi = 0x7fffffffd4f0
    TID0: INS 0x000000400b51     AVX      &lt;strong&gt;vmovdqu xmmword ptr [rsi], xmm0&lt;/strong&gt;
    TID0: Write *(UINT128*)0x7fffffffd4f0 = 138ac342_faea2787_b58eb95e_b730392a
    TID0: INS 0x000000400b55     AVX      &lt;strong&gt;vzeroupper&lt;/strong&gt;
    TID0: INS 0x000000400b58     BASE     &lt;strong&gt;call 0x400ec0&lt;/strong&gt;                        | rsp = 0x7fffffffd3f8

チップチェック機能を使用する

バージョン 2.94 以降のインテル® SDE には、実行する命令を特定のマイクロプロセッサーに限定するフィルターメカニズムが用意されています。これは、新しいソフトウェアを導入する際に役立つ診断ツールです。”sde -thelp” の出力には、この機能を制御する説明が含まれています。

-chip_check  [デフォルト ]
        特定の XED チップに限定します。
-chip_check_call_stack  [デフォルト 0]
        エラー発生時に呼び出しスタックを出力します。
-chip_check_call_stack_depth  [デフォルト 10]
        chip-check call-stack の最大の深さを指定します。
-chip_check_die  [デフォルト 1]
        エラー発生時に終了します。0=警告、1=終了
-chip_check_disable  [デフォルト 0]
        チップチェックを無効にします。
-chip_check_emit_file  [デフォルト 0]
        メッセージをファイルに出力します。0=ファイルに出力しない、1=ファイルに出力
-chip_check_exe_only  [デフォルト 0]
        main の実行ファイルのみをチェックします。
-chip_check_file  [デフォルト sde-chip-check.txt]
        chip-check エラーをファイルに出力します。
-chip_check_image
        特定のイメージをチェックするための繰り返し可能なノブ。
-chip_check_jit  [デフォルト 0]
        JIT 中のみチェックします。投機的な JIT によりチェックしたコードが
        実行されない可能性がありますが、このモードはわずかに高速です。
-chip_check_list  [デフォルト 0]
        有効なチップ名をリストして終了します。
-chip_check_list_iforms  [デフォルト 0]
        特定のチップの有効な iform をリストします。
-chip_check_stderr  [デフォルト 1]
        メッセージを標準エラー出力に表示します。0=stderr を使用しない、1=stderr を使用
-chip_check_vsyscall  [デフォルト 0]
        vsyscall 領域でのチップチェックを有効にします。
-chip_check_zcnt  [デフォルト 0]
        tzcnt/lzcnt は下位互換ですが、明示的にチェックします。

インテル® SDE が認識できるすべてのチップを表示するには、「sde -chip-check-list」を使用します。Westmere プロセッサーに命令を限定するには、「sde -chip-check WESTMERE — yourapp」を使用します。デフォルトでは、インテル® SDE は sde-chip-check.out ファイルと stderr (アプリケーションが stderr を閉じていなければ) に警告を出力します。この動作は前述のノブを使用してカスタマイズできます。

インテル® トランザクショナル・シンクロナイゼーション・エクステンション (インテル® TSX) を使用する

インテル® TSX には 2 つの主要コンポーネントがあります: 制限付きトランザクション・メモリー (RTM) とハードウェア・ロック省略 (HLE)。これはらインテル® SDE バージョン 6.1 でサポートされます。

RTM と HLE には次のオプションがあります。オプションのロングヘルプを表示するには、「sde -long-help」を実行します。

インテル® TSX (RTM と HLE) オプション

-hle_abort_log  [デフォルト 0]
            HLE アボート・ログ・イベントを収集します。
-hle_abort_log_file  [デフォルト sde-hle-abort-log.txt]
            HLE アボートログのファイル名。
-hle_elision_entries  [デフォルト 2]
            消去されたロックの最大数。
-hle_enabled  [デフォルト 0]
            HLE 機能を有効にします。
-rtm_abort_reason  [デフォルト 0]
            RTM アボート原因コードを選択します。これは、アボートモードにのみ関連します。
-rtm_extended_abort_code  [デフォルト 0]
            拡張形式のアボート原因コードをレポートします
-rtm_mode  [デフォルト disabled]
            RTM モードを選択します [disabled|abort|full|nop]。
-tsx  [デフォルト 0]
            インテル® TSX (RTM と HLE) の機能を有効にします。
-tsx_cache_set_size  [デフォルト 8]
            連想キャッシュセットのキャッシュライン数 (2 の累乗である必要はありません)。
-tsx_cache_sets_num  [デフォルト 64]
            キャッシュ内のキャッシュセット数
-tsx_debug_log  [デフォルト 0]
            ログファイルに出力するデバッグログの詳細レベルを指定します。
-tsx_file_name  [デフォルト sde-tsx-out.txt]
            インテル® TSX ログファイル名。
-tsx_log_file  [デフォルト 0]
            ログファイルを作成します (必ずしも出力されるわけではありません)。
-tsx_log_flush  [デフォルト 0]
            ライト後に毎回データをログにフラッシュします。
-tsx_log_inst  [デフォルト 0]
            命令をログファイルに出力します。
-tsx_ot_accuracy  [デフォルト moderate]
            所有権テーブルの正確性を指定します: simple、moderate。
-tsx_ownership_size  [デフォルト 16]
            log2(所有権テーブルのエントリー) のデフォルトは 16 です。
-tsx_speculation_depth  [デフォルト 7]
            許容する最大投機深度。
-tsx_stats  [デフォルト 0]
            インテル®  TSX 統計を収集します。
-tsx_stats_call_stack  [デフォルト 0]
            インテル® TSX 統計にコールスタック情報を追加します。
-tsx_stats_call_stack_size  [デフォルト 10]
            インテル® TSX 統計にコールスタック・サイズを追加します。
-tsx_stats_file  [デフォルト sde-tsx-stats.txt]
            インテル® TSX 統計ファイル名。
-tsx_stats_max_abort  [デフォルト 1000000]
            インテル® TSX 統計アボートリストの最大数。
-tsx_stats_top_most  [デフォルト 10]
            表示する最も一般的なインテル®  TSX アボート統計数。

(すべてのインテル® SDE のノブと同様に、アンダーラインの代わりにハイフンを使用できます。)

RTM には、disabled、abort、full、および nop の 4 つのモードがあります。ソフトウェアで RTM をエミュレートするのは非常に低速であるため、デフォルトはオフです。abort モードでは、xbegin を実行すると常にアボートします。full は RTM が有効なモードです。nop は RTM を NOP として扱います。RTM の使い方に関する詳細は、https://software.intel.com/en-us/blogs/2012/11/06/exploring-intel-transactional-synchronization-extensions-with-intel-software をご覧ください。

インテル® SDE は、プログラム実行中の RTM と HLE の利用に関する統計情報を示します。

#LIST OF RTM COUNTERS DATA PER THREAD
#----------------------------------------------------
# TID      XBEGIN        XEND      XABORT      ABORTS
    0          10           0           3          10
    1           0           0           0           0
    2           0           0           0           0
  TOTAL        10           0           3          10


# LIST OF HLE COUNTERS DATA PER THREAD
#---------------------------------------------------------------------------------------------------------------
# TID  XACQUIRE  SPECULATIVE  NON SPECULATIVE  GENERAL ABORTS  CONTENTION ABORTS  ELISION CACHE FULL  HLE IN RTM
    0        11            4                7               7                  0                  20           0
  TOTAL      11            4                7               7                  0                  20           0
 

# COUNTERS OF TSX ABORTS PER ABORT REASON
#-------------------------------------------------------
# REASON                         RTM ABORTS   HLE ABORTS
  ABORT_CONTENTION                        0           22
  UNFRIENDLY_INST                         0            2
  ABORT_SYNC_EXCEPTION                    2            0
  ABORT_CONTENTION                        2            0
  ABORT_XA_EXECUTED                       3            0
  CACHE_SET_FULL                          1            0
  UNFRIENDLY_INST                         1            0
  NESTING_TOO_DEEP                        1            0
 
 
# TOP 10 GENERAL ABORTS
#-----------------------------------------------------
#               IP    COUNT    INSTRUCTION DISASSEMBLY
0x0000000000e61048     4127    pause
0x0000000077351778     1483    syscall
 
 
# TOP 10 CONTENTION ABORTS
#---------------------------------------------------------------------
#               IP    COUNT    INSTRUCTION DISASSEMBLY
0x0000000000400be8       14    xchg dword ptr [rdx], eax
0x0000000000400b62        3    xrelease lock xchg dword ptr [rdx], eax
0x0000000000400a4e        2    xacquire lock xchg dword ptr [rdx], eax
0x0000000000400f5a        2    mov eax, dword ptr [rip+0x200c24]
0x0000000000400f95        1    mov dword ptr [rip+0x200be9], eax

# TOP 10 HLE BY LOCK AND IP ABORTS
#----------------------------------------------------------------------------------------
#             LOCK    COUNT                 IP    INSTRUCTION DISASSEMBLY
0x000000000120d5a0        5 0x000000000120101c    xacquire lock xchg dword ptr [rax], edx
0x000000000120d5a0        1 0x0000000001201140    xrelease lock xchg dword ptr [rax], edx
             TOTAL        6
0x000000000120d2a0        1 0x000000000120113d    mov edx, dword ptr [rbp]
             TOTAL        1

 
#LIST OF TSX GENERAL ABORT EVENTS
#-------------------------------------------------------------------------------------
# TID                 IP       DATA ADDRESS    TSX TYPE                         REASON
    0 0x0000000000400a99 0x0000000000000000         RTM           ABORT_SYNC_EXCEPTION
    0 0x0000000000400aab 0x0000000000000000         RTM           ABORT_SYNC_EXCEPTION
    0 0x0000000000400ab6 0x0000000000000000         RTM                UNFRIENDLY_INST
    0                N/A                N/A         RTM              ABORT_XA_EXECUTED
    0                N/A                N/A         RTM              ABORT_XA_EXECUTED
    0 0x0000000000400b3a 0x0000000000609f40         RTM                 CACHE_SET_FULL
    0                N/A                N/A         RTM               NESTING_TOO_DEEP
    0                N/A                N/A         RTM              ABORT_XA_EXECUTED

 
# TOP 10 HLE BY LOCK AND IP ABORTS
#----------------------------------------------------------------------------------------
#             LOCK    COUNT                 IP    INSTRUCTION DISASSEMBLY
0x000000000120d5a0        5 0x000000000120101c    xacquire lock xchg dword ptr [rax], edx
0x000000000120d5a0        1 0x0000000001201140    xrelease lock xchg dword ptr [rax], edx
             TOTAL        6
0x000000000120d2a0        1 0x000000000120113d    mov edx, dword ptr [rbp]
             TOTAL        1

 
 
#LIST OF TSX CONTENTION ABORT EVENTS
#---------------------------------------------------------------------------------------------------
# TID     TRANSACTION IP   KILLER TID          KILLER IP   KILLER DATA ADDRESS  INSIDE TSX  TSX TYPE
    4 0x0000000000400a4e            3 0x0000000000400f5a    0x0000000000601b84         YES       HLE
    3 0x0000000000400a4e            0 0x0000000000400be8    0x00000000022f0010          NO       HLE
    2 0x0000000000400a4e            0 0x0000000000400be8    0x00000000022f0010          NO       HLE
    3 0x0000000000400a4e            2 0x0000000000400f5a    0x0000000000601b84         YES       HLE
    2 0x0000000000400a4e            4 0x0000000000400a4e    0x00000000022f0010          NO       HLE
    4 0x0000000000400a4e            2 0x0000000000400a4e    0x00000000022f0010          NO       HLE
    4 0x0000000000400a4e            2 0x0000000000400f95    0x0000000000601b84         YES       HLE

トランザクションがアボートされると、インテル® SDE はその原因を表すコードを示します。

ABORT_SYNC_EXCEPTION - メモリーからのリード/ライトに失敗しました。
ABORT_ASYNC_EXCEPTION - 割り込みやシグナルなどの一般例外が発生しました。
ABORT_CONTENTION - 2 つのスレッドが競合しました。
ABORT_XA_EXECUTED - XABORT 命令が実行されました。
CACHE_SET_FULL - キャッシュが一杯です。
UNFRIENDLY_INST - RTM に適さない命令です。
NESTING_TOO_DEEP - RTM 入れ子の上限に到達しました (デフォルトは 8)。
ABORT_LOCK_SPLIT_CACHE - キャッシュライン分割を伴うアトミック命令です。
ELIDED_LOCK_UPGRADE - 解放されたロックに書き込みを行ったため、ロックの取得に失敗しました。
ELIDING_WRITE_LOCK - すでに投機的に変更されているラインでロックを省略しようとしました。
PARTIAL_ELISION_ACCESS - 交差するロックの省略が検出されました。
ELIDING_AGAIN - 同じロックを 2 度省略しようとしました。
UNLOCK_DOESNT_RESTORE - 一致しない省略ロックを解放しようとしました。
ELISION_CACHE_NOT_EMPTY - 省略しようとするキャッシュがコミット前に空ではありません。
RTM_ABORT_HLE_RTM_MIX - HLE トランザクション内で RTM トランザクションを開始しようとしました。

インテル® TSX を使用した簡単な例を紹介します。

RTM フルサポートでインテル® SDE を実行します。
   % &lt;キットへのパス&gt;/sde -rtm-mode full -- application

HLE サポートでインテル® SDE を実行します。
   % &lt;キットへのパス&gt;/sde -hle-enabled -- application

RTM と HLE サポートでインテル® SDE を実行します。
   % &lt;キットへのパス&gt;/sde -tsx -- application

インテル® TSX サポートと統計付きでインテル® SDE を実行します。
   % &lt;キットへのパス&gt;/sde -tsx -tsx-stats -- application

インテル® TSX サポートと統計およびコールスタック情報付きでインテル® SDE を実行します。
   % &lt;キットへのパス&gt;/sde -tsx -tsx-stats -tsx-stats-call-stack -- application

以下は、Windows* 上で RTM を実行する例です。

volatile int winning_thread = -1;  volatile int aborts = 0;  volatile int num_ends = 0;

unsigned __stdcall thread_worker(void * arg)
{
    int id =(int) arg;
    unsigned int status = _xbegin();
    if (status == _XBEGIN_STARTED) {
        for (int i=0; i&lt;10000000; i++) winning_thread = id;
        num_ends++;
        _xend();
    }
    else {
        aborts++;
    }
    return 0;
}

int main() {
    HANDLE threads[10];
    for (int i=0; i&lt;10; i++)
        threads[i] = (HANDLE) _beginthreadex(NULL, 0, &amp;thread_worker, (void *)i, 0, NULL);
    for (int i=0; i&lt;10; i++)
        WaitForSingleObject( threads[i], INFINITE );
    return  0;
}

インテル® コンパイラーでコンパイルする: 

% icl  /c /Foapplication.obj application.cpp
% xilink.exe /MACHINE:X64    /LARGEADDRESSAWARE:NO /OUT:application.exe application.obj
% &lt;キットへのパス&gt;/sde -tsx -- application.exe

XED 逆アセンブラーの実行

例:

    &lt;キットへのパス&gt;/xed -i foo.exe &gt; dis.txt

このコマンドは dis.txt に書き込みます。
オプションについては、ヘルプメッセージ (-help) をご覧ください。

XED は、各命令の ISA 拡張を表示します。これは、コードで使用される新しい命令を検出するのに役立ちます。
出力例:

    % xed -i il_aesdec.opt.vec.exe &gt; dis
    % cat dis
    SYM main:
    XDIS 400a40: PUSH      BASE       55                       push rbp
    XDIS 400a41: DATAXFER  BASE       4889E5                   mov rbp, rsp
    XDIS 400a44: LOGICAL   BASE       4883E480                 and rsp, 0xffffffffffffff80
    XDIS 400a48: PUSH      BASE       4154                     push r12
    XDIS 400a4a: PUSH      BASE       4155                     push r13
    XDIS 400a4c: BINARY    BASE       4881EC70010000           sub rsp, 0x170
    XDIS 400a53: DATAXFER  BASE       BEFE9F9D00               mov esi, 0x9d9ffe
    XDIS 400a58: DATAXFER  BASE       BF03000000               mov edi, 0x3
    XDIS 400a5d: CALL      BASE       E83E050000               call 0x400fa0 &lt;__intel_new_feature_proc_init&gt;
    XDIS 400a62: AVX       AVX        C5F8AE9C24F0000000       vstmxcsr dword ptr [rsp+0xf0]
    XDIS 400a6b: LOGICAL   BASE       33C0                     xor eax, eax
    XDIS 400a6d: LOGICAL   BASE       818C24F000000040800000   or dword ptr [rsp+0xf0], 0x8040
    XDIS 400a78: AVX       AVX        C5F8AE9424F0000000       vldmxcsr dword ptr [rsp+0xf0]
    XDIS 400a81: DATAXFER  AVX        C5FA6F15E7120000         vmovdqu xmm2, xmmword ptr [rip+0x12e7]
    XDIS 400a89: DATAXFER  AVX        C5FA6F0DEF120000         vmovdqu xmm1, xmmword ptr [rip+0x12ef]
    XDIS 400a91: DATAXFER  AVX        C5FA6F05F7120000         vmovdqu xmm0, xmmword ptr [rip+0x12f7]
    XDIS 400a99: MISC      BASE       8D1400                   lea edx, ptr [rax+rax*1]
    XDIS 400a9c: BINARY    BASE       FFC0                     inc eax
    XDIS 400a9e: SHIFT     BASE       48C1E204                 shl rdx, 0x4
    XDIS 400aa2: DATAXFER  AVX        C5FA7F9240395000         vmovdqu xmmword ptr [rdx+0x503940], xmm2
    XDIS 400aaa: DATAXFER  AVX        C5FA7F8A407B5000         vmovdqu xmmword ptr [rdx+0x507b40], xmm1
    XDIS 400ab2: DATAXFER  AVX        C5FA7F8240BD5000         vmovdqu xmmword ptr [rdx+0x50bd40], xmm0
    XDIS 400aba: DATAXFER  AVX        C5FA7F9250395000         vmovdqu xmmword ptr [rdx+0x503950], xmm2
    XDIS 400ac2: DATAXFER  AVX        C5FA7F8A507B5000         vmovdqu xmmword ptr [rdx+0x507b50], xmm1
    XDIS 400aca: DATAXFER  AVX        C5FA7F8250BD5000         vmovdqu xmmword ptr [rdx+0x50bd50], xmm0
    XDIS 400ad2: BINARY    BASE       3D00020000               cmp eax, 0x200
    XDIS 400ad7: COND_BR   BASE       72C0                     jb 0x400a99 &lt;main+0x59&gt;
    ...

エミュレートされるコードのデバッグ

インテル® SDE は、エミュレートされているコードのアプリケーションをデバッグする機能を提供します。システムデバッガーの使用法については、https://software.intel.com/en-us/articles/debugging-applications-with-intel-sde を参照してください。

インテル® AVX とインテル® SSE の移行をチェック

インテル® SSE を使用するコードと 256 ビットのインテル® AVX 命令を使用するコードの間には、VZEROALL または VZEROUPPER 命令を挿入することを推奨します。インテル® SDE は、インテル® SSE 命令とそれに続くインテル® AVX 命令をゼロ化命令を介さずにチェックできます。

  • Pin ツールのノブ -ast を使用します。
  • 「avx-sse-transition.out」以外のファイル名を指定するには、「-oast filename」オプションを使用します。”sde” ドライバーを使用する場合、-oast は暗黙的に -ast を指定します。
    &lt;キットへのパス&gt;/sde -oast filename.out -- user-application [args]

例:

コマンド:

    % sde -ast -- mm_256_cmpouunord_ps.opt.vec.exe

出力: “avx-sse-transition.out”

   Dynamic Dynamic
    AVX to SSE SSE to AVX Static Dynamic
    BlockPC Transition Transitio Icount Executions Icount
    ================ ============ ============ ======== ========== ========
    # TID 0
    400993 1 0 16 1 16
    4009f2 6 6 4 6 24
    4009da 7 7 4 7 28
    # SUMMARY
    # AVX_to_SSE_transition_instances: 14
    # SSE_to_AVX_transition_instances: 13
    # Dynamic_insts: 147841
    # AVX_to_SSE_instances/instruction: 0.0001
    # SSE_to_AVX_instances/instruction: 0.0001
    # AVX_to_SSE_instances/100instructions: 0.0095
    # SSE_to_AVX_instances/100instructions: 0.0088

この例では、プログラムカウンターの位置は、isnan() 呼び出しが次のコードにあることを示しています。

    source1 = _mm256_loadu_ps(s1);
    source2 = _mm256_loadu_ps(s2);
    dest=_mm256_cmpunord_ps(source1,source2);
    _mm256_storeu_ps((float*) d, dest);
    for (i = 0; i &lt; 8; i++) {
        if (isnan(s1[i]) || isnan(s2[i])) {
            e[i] = -1;
        }
        else {
            e[i] = 0;
        }
    }

プログラムの記録と再生にインテル® SDE を使用

インテル® SDE は、プログラムの記録と再生にピンプレイ技術を採用しています。

この技術の詳細に関しては、ピンプレイの記事「プログラム記録/再生ツールキット」 (英語) をご覧ください。

ピンボール (ピンプレイのチェックポイント) を作成する基本コマンドは次のようになります。

 % &lt;キットへのパス&gt;/sde -log -log:basename &lt;dir&gt;/&lt;name&gt; -- user-application [args]

(64 ビット・アプリケーションからキャプチャーされた) ピンボールを再生する基本コマンドは次のようになります。

 % &lt;キットへのパス&gt;/sde -replay -replay:basename &lt;dir&gt;/&lt;name&gt; -replay:addr_trans -- &lt;キットへのパス&gt;/intel64/nullapp

-mix など、その他のインテル® SDE オプションは、再生モードでも利用できます。

エミュレーション制御フロー強制テクノロジー向けにインテル® SDE を使用

インテルの制御フロー強制テクノロジー (CET) については、https://software.intel.com/en-us/isa-extensions/cet-preview で説明されています。

インテル® SDE は現在、このテクノロジーのユーザー空間と、CET スタックチェックまたは CET 間接分岐チェックでコンパイルされたソフトウェアの対応状況をエミュレートする方法を提供しています。インテル® SDE は、既存のホスト (Linux* および Windows*) 上でアプリケーション実行をサポートし、CET でコンパイルされていない従来のランタイム・ライブラリーで実行することによる誤ったレポートを軽減する方法を提供します。

インテル® SDE 環境下で制御フロー強制テクノロジーを使用したアプリケーションを実行する手順は、https://software.intel.com/en-us/articles/emulating-applications-with-intel-sde-and-control-flow-enforcement-technology で説明されています。

システム構成 

Linux*

Ubuntu* システムでは、yama 機能によりプロセスは親プロセスへ ptrace をアタッチできません。インテル® SDE は、これを利用してプロセスに自身を投入します。システムで yama 機能を無効にするには、root 権限で次を実行します。

 # echo 0 &gt; /proc/sys/kernel/yama/ptrace_scope

この変更は、リブートするまで保持されます。こほ変更を永続的なものにするには、システムの init スクリプトに上記を追加します。

macOS*

インテル® SDE は、(アタッチモードでも、起動モードでも) タスクポート API を使用してアプリケーション・プロセスに自身を投入します。これにより、ほかのプロセスが制御可能であることを確認するポップアップ・ウィンドウが表示されます。このメッセージは、インテル® SDE が GUI セッションで初めて起動されたときにのみ表示されます。GUI 以外のセッション (SSH など) で実行される場合、ポップアップは表示されず即座に失敗します。これに対処するには、OS がポップアップを表示せず、プロセスの引き継を自動的に確認するように、次の手順に従って、マシンを一度だけ設定する必要があります。

システム整合性保護

システム整合性保護 (System Integrity Protection) は、macOS* El Capitan (10.11) で導入されたセキュリティー技術であり、root ユーザー・アカウントを制限し、root ユーザーが macOS* オペレーティング・システムの保護された領域で実行できる操作を制御します。
システム整合性保護には、次のシステム領域への保護が含まれます。

システム整合性によって保護されるアプリケーションをインテル® SDE で実行するには、システム整合性保護を無効にする必要があります。

システム整合性保護を無効/有効にするには、次の記事の最後にある指示に従ってください。
SIP の変更方法: http://www.macworld.com/article/2986118/security/how-to-modify-system-integrity-protection-in-el-capitan.html

システム整合性ポリシーとその影響については、次の記事を参照してください: Apple* SIP

コード例: AES-128 暗号化および複合化ルーチン

このサンプルコードは、ECB モードで AES-128 を使用する暗号化および複合化ルーチンを説明する C ルーチンです。サンプルコードをダウンロードする前に、使用許諾契約書をお読みください。

よくあるお問い合わせ

インテル® SDE をダウンロードするには?
インテル® SDE はダウンロード・ページ (英語) から入手できます。

問い合わせは方法は?
https://software.intel.com/en-us/forums/intel-avx-and-cpu-instructions/ でお問い合わせいただけます。インテルのエンジニアがフォーラムを巡回し、ユーザーの質問に答えています。

システム要件は?
インテル® SDE は、IA-32 またはインテル® 64 アーキテクチャー・ベースの Windows*、Linux* または macOS* 上で動作します。

CPUID 要件は?
Pin とインテル® SDE を実行するには、インテル® Pentium® 4 プロセッサー以降が必要です。

インテル® 64 アーキテクチャー・ベースのプラットフォーム上で IA-32 アーキテクチャー向けアプリケーションは実行できますか?
はい、実行できます。

MXCSR の正確なインテル® SSE 例外処理は動作しますか?
インテル® SDE は MXCSR 例外フラグを正確に設定することを試みますが、マスクされていない浮動小数点例外はサポートされません。

プログラムがエミュレートされた命令のアクセスできないメモリーを逆参照したらどうなりますか?
インテル® SDE はクラッシュします。詳しいエラーメッセージを表示するには、「sde -ptr-check — your app」を使用します。または、「sde -trace-execute — your app」を使用して、タスク内で実行された命令のダンプを取得し、最後に実行された命令を検出できます。そして、最後に実行された命令の実効アドレス計算に関連するレジスターへの最後の書き込みを特定するため、「sde -debugtrace — your app」を使用します。

インテル® SDE は、cygwin/cygdrive/c パスまたは symlink を扱えますか?
いいえ、Pin がサポートしないため、インテル® SDE では扱えません。

Pin についてさらに詳しい情報を得るには?
http://pintool.org (英語) と Yahoo* グループの「pinheads」で入手できます。Pin のリリースノート (http://www.pintool.org/docs/24110/README) も参照してください。Pin 上に構築されるインテル® SDE の利用方法に関する追加情報と制限事項が説明されています。

ミックスと debugtrace についてさらに詳しい情報を得るには?
ダウンロード・ページ (英語) をご覧ください。
debugtrace とミックスの基本的な情報は、Pin ウェブサイト (http://pintool.org/) の Pin キットにあります。これを基に、インテル® SDE を起動して新しいレジスターを表示するように変更することもできます。

ライセンス条項は?
ダウンロード・ページ (英語) をご覧ください。

インテル® SDE を Ubuntu* 10 以降で動作せるには?
インテル® SDE を Linux* 上で使用する場合、sysctl /proc/sys/kernel/yama/ptrace_scope で ptrace をアタッチできない既知の問題があります。この場合、Pin はデフォルトの投入モード (親プロセスへ ptrace をアッタッチ) を使用できません。この問題を解決するには、次の echo コマンドを root 権限で実行します (インテル® SDE は root 権限で実行する必要はありません)。
$ echo 0 > /proc/sys/kernel/yama/ptrace_scope

技術担当者

Ady Tal: Ady は、インテル社のソフトウェア & サービスグループのシニア・ソフトウェア・エンジニアです。1996 年にインテルに入社し、コンパイラー、アーキテクチャー、およびイネーブリング・チームをサポートする新しい命令セットのエミュレーションに取り組んでいます。

関連情報

  1. 次の手順でマシンのセキュリティー設定をファイルにダンプします。
     % security authorizationdb read system.privilege.taskport &gt; /some/file
    
  2. このファイルを編集して、次のキー/値を true から false に変更します。
     &lt;key&gt;authenticate-user&lt;/key&gt;
     &lt;true/&gt;
    
  3. 次の方法で設定をマシンに戻します。
     % sudo security authorizationdb write system.privilege.taskport &lt; /some/file
    
  4. これでマシンの準備ができました。
    • /System
    • /usr
    • /bin
    • /sbin
    • macOS* に事前インストールされているアプリケーション
    • Windows* – 使用許諾に同意してダウンロードする
      https://software.intel.com/sites/default/files/m/f/2/7/aes_sample_windows.zip
    • Linux* – 使用許諾に同意してダウンロードする
      https://software.intel.com/sites/default/files/a3/97/aes_sample_linux.tar.gz
    • ISA 拡張ディスカッション・フォーラム
      https://software.intel.com/en-us/forums/intel-isa-extensions
    • 新しい命令のエミュレーション・ブログ (2008)
      https://software.intel.com/en-us/blogs/2008/08/11/emulation-of-new-instructions

開発コード名

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

タイトルとURLをコピーしました