ニュース

Intel、既存ソフトも再コンパイルで高速化できる「APX拡張」

 Intelは、開発者向けドキュメントの中で、汎用レジスタを倍増させることで性能を向上させられる「Intel Advanced Performance Extensions:(Intel APX)」に関する文書を公開した。

 APXの仕組みは至極単純明快で、既存の汎用レジスタ(general-purpose registers:GPRs)を16から32(追加されたのはR16~R31)に倍増させる。これによりコンパイラが保持できる値を増やし、Intel 64ベースでコンパイルされたコードと比較してロードを10%、ストアを20%削減できる。

 この仕組みによりシリコンのエリアやコアの消費電力を増加させることなく、さまざまなワークロードにおいて効率的な性能向上を実現。レジスタのアクセスが減れば高速化されるだけでなく、複雑なロードストア操作が減ることでダイナミック電力が削減できる効果も得られる。

 APXの利用は、新しいコンパイラにおいて「REX2」という新プリフィックスを付加するだけ。これにより従来の整数命令セットも新しいレジスタに均一にアクセス可能になる。一方Intel AVX命令に関してはEVEXプリフィックスで定義された新しいビットを介してアクセスできる。従来の整数命令もEVEXを使用し、専用のデスティネーションレジスタオペラントをエンコードできるようになり、3オペラント命令に置き換わることで余計なレジスタ移動命令を削減できるという。

REX2プリフィックス

 APXではこれらのプリフィックスの増加により平均命令長は増加することになるが、命令数は10%削減するため、コード密度に関しては従来とほぼ同じになるとしている。

新しい汎用レジスタの機能

 新しい汎用レジスタはXSAVEが有効になっており、コンテキストスイッチを行なう際は自動的にXSAVE/XRSTORシーケンスによりセーブとリストアが行なわれる。

 新しい汎用レジスタはアプリケーションバイナリインターフェイス(ABIs)の中でcaller-saved(揮発性)状態として定義されており、レガシーバイナリとの相互運用性を確保する。最適化された呼び出し規則により、レガシーの互換性要件を緩和するという。

 また、より多くのレジスタ状態は、機能境界の管理を強化する必要がある。アソシエイトに関するオーバーヘッドを削減するため、1回のメモリ操作で2つのレジスタの値を転送する「PUSH2」、「POP2」命令が追加される。プロセッサはこの2つの新命令を内部で追跡し、一致するPUSH2/POP2命令があった場合メモリを経由せずにレジスタのデータを転送する。

EVEXによって拡張されるPUSH2とPOP2命令

 以上の機能は確かに性能向上には有効だが、データ条件付き分岐の予測ミスが多数発生するワークロードでは効果が限定的になる。IntelはPentium Proでこの問題を解消するために「CMOV」、「SET」命令を導入し、今日広く採用されているが、if変換(分岐を条件付き命令に置き換えるコンパイラの最適化)には制限が大きいとする。

 そこでAPXではロード、ストア、比較、テスト命令に条件付きのフォームを追加し、一般的な命令のステータスフラグの書き込みを抑制するコンパイラのオプションも追加。これによりより大きなコード領域でif変換を適用でき、予測ミスが発生する可能性のある分岐数を削減する。これらすべての条件付き命令の強化機能は、既存命令のEVEXプリフィックスの拡張によって実現する。

 このように、アプリケーション開発者は既存のソースコードを変更することなく、再コンパイルするだけでAPXによってもたらされる性能向上の利点を享受できる。Intelは過去40年にわたってx86アーキテクチャを進化させてきたが、APXのような拡張は命令デコードのハードウェアの段階的な変更のみで実現でき、x86の可変長命令エンコーディングの利点を示すものとなっているわけだ。