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

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

これらの組込み関数を使用してプログラムを作成するには、ストリーミングSIMD拡張命令によって提供されるハードウェア機能をよく理解している必要があります。特に、次の3つの重要な点に注意してください。

データ型

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

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

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

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

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

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

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

互換性とパフォーマンス

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

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

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