インテル® ストリーミング SIMD 拡張命令 (インテル® SSE) の組み込み関数によって、IA-64 アーキテクチャー上でインテル® ストリーミング SIMD 拡張命令を利用できます。IA-32 アーキテクチャーとのソースコードの互換性を保つために、これらの組み込み関数の名前と機能は、IA-32 アーキテクチャー・ベースのインテル® SSE の組み込み関数セットと同等になっています。
これらの組み込み関数を使用してプログラムを作成するには、インテル® SSE によって提供されるハードウェア機能をよく理解している必要があります。特に、次の点に注意してください。
SSE の組み込み関数は、新しいデータ型の __m128 を使用します。このデータ型は、4 つの単精度浮動小数点値で構成される 128 ビット・データを表します。これは 128 ビットの IA-32 アーキテクチャー・ベースのインテル® ストリーミング SIMD 拡張命令レジスターに対応します。
コンパイラーは、__m128 型のローカルデータのアライメントを、スタック上の 16 バイト境界に合わせます。これらのデータ型のグローバルデータも、16 バイトにアライメントを合わせます。integer 型、float 型、または double 型の配列のアライメントを合わせるには、declspec 宣言子を使用できます。
IA-64 命令は、パックドデータの操作でもスカラーデータの操作でも、同じ方法で SSE レジスターを操作します。したがって、スカラーデータを表す __m32 データ型はありません。スカラー操作には、__m128 オブジェクトと "スカラー" 形式の組み込み関数を使用します。コンパイラーとプロセッサーは、32 ビットのメモリー参照によって、これらの操作を実行します。ただし、パフォーマンス上の理由で、できるだけスカラー形式の操作をパックド形式の操作で置き換えることをお勧めします。
__m128 オブジェクトのアドレスを指定できます。
詳細については、『インテル® Itanium® アーキテクチャー・ソフトウェア・デベロッパーズ・マニュアル、第 2 巻: システム・アーキテクチャー』、インテル社、資料番号 245318-004J を参照してください。
インテル® SSE の組み込み関数は、__m128 データ型について定義しています。このデータ型は、4 つの単精度浮動小数点値で構成される 128 ビット・データです。IA-64 アーキテクチャー・ベースのシステム用の SIMD (single-instruction multiple data) 命令は、2 つの単精度浮動小数点値を保持する 64 ビット浮動小数点レジスターのデータを操作します。したがって、それぞれの __m128 オペランドは、実際には浮動小数点レジスターのペアになります。このため、各組み込み関数は、浮動小数点レジスターオペランドのペアを操作する、少なくとも 2 つの IA-64 命令に対応します。
IA-64 アーキテクチャー・ベースのシステム用のインテル® SSE の組み込み関数はほとんど、パフォーマンスの向上のためではなく、既存の IA-32 アーキテクチャー・ベースの組み込み関数との互換性を保つために用意されたものです。IA-32 アーキテクチャー上でパフォーマンスを向上させる組み込み関数を使用しても、IA-64 アーキテクチャー・ベースのシステム上ではパフォーマンスが向上しない場合もあります。この理由の 1 つとして、一部の組み込み関数は、IA-32 命令セットには厳密に対応付けられますが、IA-64 命令セットには対応付けられていない場合があります。したがって、IA-64 アーキテクチャー・ベースのシステム上でのパフォーマンスの向上のために用意している組み込み関数と、単に既存の IA-32 アーキテクチャー・ベースのコードとの互換性を保つために用意している組み込み関数は、区別して使用する必要があります。
次の組み込み関数を使用すると、パフォーマンスが低下する可能性があります。これらの組み込み関数は、既存のコードを移植する場合や、重要でないコードセクションにのみ使用してください。
インテル® SSE のスカラー組み込み関数 (名前の最後に _ss が付くもの) - できるだけパックド (_ps) 版を使用してください。
インテル® SSE の比較組み込み関数 comi および ucomi - これらの組み込み関数は、IA-32 アーキテクチャー・ベースの COMISS 命令および UCOMISS 命令にのみ対応します。これらの組み込み関数を実行するには、一連の IA-64 命令を実行する必要があります。
変換操作には、通常は複数の命令が必要です。_mm_cvtpi16_ps、_mm_cvtpu16_ps、_mm_cvtpi8_ps、_mm_cvtpu8_ps、_mm_cvtpi32x2_ps、_mm_cvtps_pi16、_mm_cvtps_pi8 は、特にパフォーマンス上のコストがかかります。
インテル® SSE ユーティリティー組み込み関数 _mm_movemask_ps
精度が多少低下してもかまわない場合は、真の div 組み込み関数や sqrt 組み込み関数の代わりに、逆数の近似値を計算する SIMD の組み込み関数 (rcp) や逆数の平方根の近似値を計算する SIMD の組み込み関数 (rsqrt) を使用すれば、処理速度が大幅に向上します。