◆avitl0QFUE氏、Aroo氏による
NL-Means filterSSE2版(計算モード2)のソースコード(src/ProcessorSse2Aroo.cpp)を読むために。
データ型
__m64
64ビットの共用体。8ビットのintまたはunsigned int8個 ~ 64ビットのintまたはunsigned int1個、32ビットfloat2個。
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バイトの整数
typedef long long __m128;
__m128i
128ビットの共用体。8ビットintまたはunsigned int16個 ~ 64ビットintまたはunsigned int2個。関数名にepi32やepi16がついていたら、この型に関係がある。
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個。
typedef struct __declspec(intrin_type) _CRT_ALIGN(16) __m128d {
double m128d_f64[2];
} __m128d;
intrinsic(組み込み)関数
表現
浮動小数点数
psやsdといった名前がつく。
- *d
2つの倍精度浮動小数点数
- *s
4つの短精度浮動小数点数
- p*
packed演算。それぞれの数値に何がしかの演算が行われる(たぶん)。
m128d_f64[2] r, m128d_f64[2] a, m128d_f64[2] b
r0 := a0 + b0
r1 := a1 + b1
- s*
scalar演算。入力値に演算を行わないで、そのままの値が使われる数値がある(たぶん)。
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
m128i_i8[16] r, m128i_i8[16] a, m128i_i8[16] b
r0 := a0 + b0
r1 := a1 + b1
...
r15 := a15 + b15
sub
減算 subtract、subtraction
m128i_i16[8] r, m128i_i16[8] a, m128i_i16[8] b
r0 := a0 - b0
r1 := a1 - b1
...
r7 := a7 - b7
mul
乗算 multiple、multiplication
m128d_f64[2] r, m128d_f64[2] a, m128d_f64[2] b
r0 := a0 * b0
r1 := a1
整数のみ。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
浮動小数点数のみ。
m128d_f64[2] r, m128d_f64[2] a, m128d_f64[2] b
r0 := a0 / b0
r1 := a1 / b1
madd
乗算と和算
整数のみ。
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、浮動小数点数のみ。データ型はよく分からん。
__m128 _mm_rcp_ps(__m128 a );
r0 := recip(a0)
r1 := recip(a1)
r2 := recip(a2)
r3 := recip(a3)
__m128 _mm_rcp_ss(__m128 a );
r0 := recip(a0)
r1 := a1 ; r2 := a2 ; r3 := a3
avg
平均
max
最大値
min
最小値
sad
差の絶対値の和 Sum ofAbsolute Difference?
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
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)
最終更新:2008年10月08日 23:46