Itanium(R) アーキテクチャー上でのストリーミング SIMD 拡張命令の使用

ストリーミング SIMD 拡張命令 (SSE) の組み込み関数によって、Itanium(R) アーキテクチャー上でストリーミング SIMD 拡張命令を利用できます。IA-32 アーキテクチャーとのソースコードの互換性を保つために、これらの組み込み関数の名前と機能は、IA-32 ベースの SSE の組み込み関数セットと同等になっています。

これらの組み込み関数を使用してプログラムを作成するには、SSE によって提供されるハードウェア機能をよく理解している必要があります。特に、次の点に注意してください。

データ型

SSE の組み込み関数は、新しいデータ型の __m128 を使用します。このデータ型は、4 つの単精度浮動小数点値で構成される 128 ビット・データを表します。これは 128 ビットの IA-32 ストリーミング SIMD 拡張命令レジスターに対応します。

コンパイラーは、__m128 型のローカルデータのアライメントを、スタック上の 16 バイト境界に合わせます。これらのデータ型のグローバルデータも、16 バイトにアライメントを合わせます。integer 型、float 型、または double 型の配列のアライメントを合わせるには、declspec 宣言子を使用できます。

Itanium 命令は、パックドデータの操作でもスカラーデータの操作でも、同じ方法で SSE レジスターを操作します。したがって、スカラーデータを表す __m32 データ型はありません。スカラー操作には、__m128 オブジェクトと "スカラー" 形式の組み込み関数を使用します。コンパイラーとプロセッサーは、32 ビットのメモリー参照によって、これらの操作を実行します。ただし、パフォーマンス上の理由で、できるだけスカラー形式の操作をパックド形式の操作で置き換えることをお勧めします。

__m128 オブジェクトのアドレスを指定できます。

詳細については、『IA-32 インテル(R) アーキテクチャー・ソフトウェア・デベロッパーズ・マニュアル、中巻 A: 命令セット・リファレンス A-M』、インテル社、資料番号 253666-013J を参照してください。

Itanium ベース・システム上での実装手法

SSE の組み込み関数は、__m128 データ型について定義しています。このデータ型は、4 つの単精度浮動小数点値で構成される 128 ビット・データです。Itanium ベースのシステム用の SIMD 命令は、2 つの単精度浮動小数点値を保持する 64 ビット浮動小数点レジスターのデータを操作します。したがって、それぞれの __m128 オペランドは、実際には浮動小数点レジスターのペアになります。このため、各組み込み関数は、浮動小数点レジスターオペランドのペアを操作する、少なくとも 2 つの Itanium 命令に対応します。

互換性とパフォーマンス

Itanium ベースのシステム用の SSE の組み込み関数はほとんど、パフォーマンスの向上のためではなく、既存の IA-32 組み込み関数との互換性を保つために用意されたものです。IA-32 システム上でパフォーマンスを向上させる組み込み関数を使用しても、Itanium ベースのシステム上ではパフォーマンスが向上しない場合もあります。この理由の 1 つとして、一部の組み込み関数は、IA-32 命令セットには厳密に対応付けられますが、Itanium 命令セットには対応付けられていない場合があります。したがって、Itanium ベースのシステム上でのパフォーマンスの向上のために用意している組み込み関数と、単に既存の IA-32 コードとの互換性を保つために用意している組み込み関数は、区別して使用する必要があります。

次の組み込み関数を使用すると、パフォーマンスが低下する可能性があります。これらの組み込み関数は、既存のコードを移植する場合や、重要でないコードセクションにのみ使用してください。

精度が多少低下してもかまわない場合は、真の div 組み込み関数や sqrt 組み込み関数の代わりに、逆数の近似値を計算する SIMD の組み込み関数 (rcp) や逆数の平方根の近似値を計算する SIMD の組み込み関数 (rsqrt) を使用すれば、処理速度が大幅に向上します。