最終更新:2012-03-02 (金) 12:40:51 (4606d)
SSE/実装
参考になるサイト
SIMD命令を使用したプログラムの作成方法
- コンパイラのオプションを変更しSIMD命令セットを有効にし、記述はコンパイラに任せる
- イントリンシック命令を使用する
- インラインアセンブラを用いる
- 外部アセンブラでアセンブル?したオブジェクトファイルをリンクする
レジスタ
名前 | サイズ | SIMD命令 | 型 |
MMXレジスタ | 64bit | MMX | __m64 |
XMMレジスタ | 128bit | SSE | __m128(パックド単精度浮動小数点) __m128d(パックド倍精度浮動小数点) __m128i(パックド整数) |
YMMレジスタ | 256bit | AVX |
イントリンシック命令を使う時のヘッダ
#include <nmmintrin.h> // MMX-SSE4.2命令セットを使用する場合インクルード // #include <smmintrin.h> // MMX-SSE4.1命令セットを使用する場合インクルード // #include <intrin.h> // MMX-SSE3命令セットを使用する場合インクルード // #include <emmintrin.h> // MMX-SSE2命令セットを使用する場合インクルード // #include <xmmintrin.h> // MMX-SSE命令セットを使用する場合インクルード // #include <mmintrin.h> // MMX命令セットを使用する場合インクルード //
__m128にアクセス
- 添字を利用
__m128 xmmsrc; xmmsrc.m128_f32[0] = 1.28; xmmsrc.m128_f32[1] = 2.56;
- 組み込み関数を使う
float* pSrc; __m128 xmmsrc; // メモリを確保し、pSrcに処理するデータを入力 // xmmsrc = _mm_load_ps(pSrc); /* xmmsrcにpSrc[0]~pSrc[3]の値を転送 */ _mm_store_ps(pSrc, xmmsrc); /* pSrc[0]~pSrc[3]にxmmsrcの値を転送 */
- イントリンシック命令を使用すればコンパイラが使用するSIMDレジスタを決定してくれるので、レジスタ管理の煩雑さから解放されます。
- ただし、組み込み型を宣言してもかならずしもSIMDレジスタが使用される保証はありません。
- 場合によってはメモリに領域が確保されることもあります。その場合は必ず16バイト境界にアライメントされるため、アライメントについて頭を悩ませる必要はありません。