メモ > SSE2

◆avitl0QFUE氏、Aroo氏によるNL-Means filterSSE2版(計算モード2)のソースコード(src/ProcessorSse2Aroo.cpp)を読むために。




データ型

ソースコードを見るなら、Google ソースコード検索の検索オプションからファイル名を指定すると探しやすい。

__m64

64ビットの共用体。8ビットのintまたはunsigned int8個 ~ 64ビットのintまたはunsigned int1個、32ビットfloat2個。
  • mmintrin.h
typedef union __declspec(intrin_type) _CRT_ALIGN(8) __m64
{
    unsigned __int64    m64_u64;
    float               m64_f32[2];
    __int8              m64_i8[8];
    __int16             m64_i16[4];
    __int32             m64_i32[2];
    __int64             m64_i64;
    unsigned __int8     m64_u8[8];
    unsigned __int16    m64_u16[4];
    unsigned __int32    m64_u32[2];
} __m64;

__m128

long long、8バイトの整数
  • xmmintrin.h
typedef long long __m128;

__m128i

128ビットの共用体。8ビットintまたはunsigned int16個 ~ 64ビットintまたはunsigned int2個。関数名にepi32やepi16がついていたら、この型に関係がある。
  • emmintrin.h
typedef union __declspec(intrin_type) _CRT_ALIGN(16) __m128i {
    __int8              m128i_i8[16];
    __int16             m128i_i16[8];
    __int32             m128i_i32[4];
    __int64             m128i_i64[2];
    unsigned __int8     m128i_u8[16];
    unsigned __int16    m128i_u16[8];
    unsigned __int32    m128i_u32[4];
    unsigned __int64    m128i_u64[2];
} __m128i;

__m128d

128ビットの構造体。64ビットdouble2個。
  • emmintrin.h
typedef struct __declspec(intrin_type) _CRT_ALIGN(16) __m128d {
    double              m128d_f64[2];
} __m128d;

intrinsic(組み込み)関数

表現

浮動小数点数

psやsdといった名前がつく。
  • *d
    2つの倍精度浮動小数点数
  • *s
    4つの短精度浮動小数点数
  • p*
    packed演算。それぞれの数値に何がしかの演算が行われる(たぶん)。
    • _mm_add_pd
m128d_f64[2] r, m128d_f64[2] a, m128d_f64[2] b
r0 := a0 + b0
r1 := a1 + b1
  • s*
    scalar演算。入力値に演算を行わないで、そのままの値が使われる数値がある(たぶん)。
    • _mm_add_sd
m128d_f64[2] r, m128d_f64[2] a, m128d_f64[2] b
r0 := a0 + b0
r1 := a1

整数

si64、su32、epi16といった名前がつく。
  • s*
    __m64型の整数
  • ep*
    __m128型の整数
  • *i
    int
  • *u
    unsigned int
  • 数値
    データのビット数

四則演算など

演算の名前の後ろに「s」がついたら、飽和演算saturateを行う。それ以外はラップアラウンド

add
加算 add、addition

  • _mm_add_epi8
m128i_i8[16] r, m128i_i8[16] a, m128i_i8[16] b
r0 := a0 + b0
r1 := a1 + b1
...
r15 := a15 + b15

sub
減算 subtract、subtraction

  • _mm_sub_epi16
m128i_i16[8] r, m128i_i16[8] a, m128i_i16[8] b
r0 := a0 - b0
r1 := a1 - b1
...
r7 := a7 - b7

mul
乗算 multiple、multiplication

  • _mm_mul_sd
m128d_f64[2] r, m128d_f64[2] a, m128d_f64[2] b
r0 := a0 * b0
r1 := a1
  • _mm_mulhi_epi16
整数のみ。aからの8個の16ビット符号付整数と、bからの8個の16ビット符号付整数とを、掛け合わせる。その結果である8個の32ビット列の、上位16ビットをパックする。_mm_mullo_epi16であれば、下位16ビットをパックする。
m128i_i16[8] r, m128i_i16[8] a, m128i_i16[8] b
r0 := (a0 * b0)[31:16]
r1 := (a1 * b1)[31:16]
...
r7 := (a7 * b7)[31:16]

div
除算 divide、division

浮動小数点数のみ。
  • _mm_div_pd
m128d_f64[2] r, m128d_f64[2] a, m128d_f64[2] b
r0 := a0 / b0
r1 := a1 / b1

madd
乗算と和算

整数のみ。
  • _mm_madd_epi16
aからの8個の16ビット符号付整数と、bからの8個の16ビット符号付整数とを、掛け合わせる。その結果である32ビット符号付整数を対にして足し合わせ、最後に4つの32ビット符号付整数をパックする。
m128i_i32[4] r, m128i_i16[8] a, m128i_i16[8] b
r0 := (a0 * b0) + (a1 * b1)
r1 := (a2 * b2) + (a3 * b3)
r2 := (a4 * b4) + (a5 * b5)
r3 := (a6 * b6) + (a7 * b7)

rcp
逆数 reciprocal

Microsoft Visual Studio 2008/.NET Framework 3.5、浮動小数点数のみ。データ型はよく分からん。
  • _mm_rcp_ps
__m128 _mm_rcp_ps(__m128 a );
r0 := recip(a0)
r1 := recip(a1)
r2 := recip(a2)
r3 := recip(a3)
  • _mm_rcp_ss
__m128 _mm_rcp_ss(__m128 a );
r0 := recip(a0)
r1 := a1 ; r2 := a2 ; r3 := a3

avg
平均

max
最大値

min
最小値

sad
差の絶対値の和 Sum ofAbsolute Difference?

  • _mm_sad_epu8
16個の8ビット符号無し整数の、差の絶対値を計算する。上位の8つと下位の8つで和を取り、その結果である2つの16ビット符合無し整数を上位と下位の64ビット要素にパックする。
m128i_i16[8] r, m128i_i8[16] a, m128i_i8[16] b
r0 := abs(a0 - b0) + abs(a1 - b1) +...+ abs(a7 - b7)
r1 := 0x0 ; r2 := 0x0 ; r3 := 0x0
r4 := abs(a8 - b8) + abs(a9 - b9) +...+ abs(a15 - b15)
r5 := 0x0 ; r6 := 0x0 ; r7 := 0x0 

s
シフト演算


値のセット

set

load

shuffle

unpack

stream


型変換

cvt


比較

cmp


その他

empty


情報源

MSDN ライブラリ
開発ツールと言語ドキュメント
Visual Studio 2008
Visual Studio
Visual C++
Visual C++ のリファレンス
C/C++ Languages
Compiler Intrinsics
MMX, SSE, and SSE2 Intrinsics

  • スレ49
670 :名無しさん@お腹いっぱい。:2008/10/03(金) 03:25:17 ID:8FNvltxR0
    >>◆avitl0QFUE氏、Aroo氏

    NL-Meansフィルタの計算モード2において、時間範囲を1以上にすると、
    時間変化をしている部分が黒く塗りつぶされてしまいます。

    ProcessorSse2Aroo.cppをせっせと読みましたが、
    usum2とvsum2を初期化している366-367行目を、
    その直後のdtのループに入れるべきなんじゃないかと思います。
    ProcessorCpu.cppでも、sum2の初期化はdtのループの中で行われてますので。



  • とりあえずページを作成 -- 41991 (2008-10-03 14:37:36)
名前:
コメント:

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2008年10月08日 23:46
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。