最終更新:2012-03-02 (金) 12:40:51 (4436d)  

SSE/実装
Top / SSE / 実装

参考になるサイト

SIMD命令を使用したプログラムの作成方法

レジスタ

名前サイズSIMD命令
MMXレジスタ64bitMMX__m64
XMMレジスタ128bitSSE__m128(パックド単精度浮動小数点)
__m128d(パックド倍精度浮動小数点)
__m128i(パックド整数)
YMMレジスタ256bitAVX

イントリンシック命令を使う時のヘッダ

#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バイト境界にアライメントされるため、アライメントについて頭を悩ませる必要はありません。

SSEのチェック (cpuid命令)

EAXレジスタ?に1を格納しcpuid命令を実行

  • EDXレジスタ

参考

組み込み関数(intrinsic)によるSIMD入門 from Norishige Fukushima

参考