「メモ/SSE2」の編集履歴(バックアップ)一覧はこちら
メモ/SSE2 - (2008/10/03 (金) 14:36:45) の最新版との変更点
追加された行は緑色になります。
削除された行は赤色になります。
◆avitl0QFUE氏、Aroo氏による[[NL-Means filter>http://kishibe.dyndns.tv/index.php?%E3%83%95%E3%83%AA%E3%83%BC%E3%82%BD%E3%83%95%E3%83%88%2FNL-Means%20filter]]SSE2版(計算モード2)のソースコードを読むために。
&arrow(6)src/ProcessorSse2Aroo.cpp
_mm_madd_epi16とか、_mm_cvtepi32_psとかの最低限の解説。何をやろうとしているのか、この「作品」を読むために。
…今週末は忙しいので、週が明けたら書きます。
こんな感じで&br()&arrow(2)
***_mm_add_epi32
足し算
***_mm_sub_epi16
subtraction、引き算
***_mm_mul_ps
multiple、掛け算
***_mm_madd_epi16
multiple、add、ベクトルの内積みたいなこと
-スレ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のループの中で行われてますので。
-----
#comment()
◆avitl0QFUE氏、Aroo氏による[[NL-Means filter>http://kishibe.dyndns.tv/index.php?%E3%83%95%E3%83%AA%E3%83%BC%E3%82%BD%E3%83%95%E3%83%88%2FNL-Means%20filter]]SSE2版(計算モード2)のソースコード(src/ProcessorSse2Aroo.cpp)を読むために。
#contents(fromhere=true)
----
*データ型
ソースコードを見るなら、[[Google ソースコード検索>http://www.google.co.jp/codesearch?hl=ja]]の検索オプションからファイル名を指定すると探しやすい。
***__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&br()2つの倍精度浮動小数点数
-*s&br()4つの短精度浮動小数点数
-p*&br()packed演算。それぞれの数値に何がしかの演算が行われる(たぶん)。
--_mm_add_pd
m128d_f64[2] r, m128d_f64[2] a, m128d_f64[2] b
r0 := a0 + b0
r1 := a1 + b1
-s*&br()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*&br()__m64型の整数
-ep*&br()__m128型の整数
-*i&br()int
-*u&br()unsigned int
-数値&br()データのビット数
**四則演算など
演算の名前の後ろに「s」がついたら、飽和演算saturateを行う。それ以外はラップアラウンド
***add&br()加算 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&br()減算 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&br()乗算 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&br()除算 divide、division
浮動小数点数のみ。
-_mm_div_pd
m128d_f64[2] r, m128d_f64[2] a, m128d_f64[2] b
r0 := a0 / b0
r1 := a1 / b1
***madd&br()乗算と和算
整数のみ。
-_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&br()逆数 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&br()平均
***max&br()最大値
***min&br()最小値
***sad&br()差の絶対値の和 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&br()シフト演算
**値のセット
***set
***load
***shuffle
***unpack
***stream
**型変換
***cvt
**比較
***cmp
**その他
***empty
*情報源
-MSDN
--http://msdn.microsoft.com/ja-jp/library/y0dh78ez(VS.80).aspx
---MSDN&br()MSDN ライブラリ&br()開発ツールと言語ドキュメント&br()Visual Studio 2005&br()Visual Studio ドキュメント&br()Visual C++&br()リファレンス&br()C/C++ Languages&br()Compiler Intrinsics&br()MMX, SSE, and SSE2 Intrinsics
--http://msdn.microsoft.com/ja-jp/library/y0dh78ez.aspx
---MSDN
MSDN ライブラリ&br()開発ツールと言語ドキュメント&br()Visual Studio 2008&br()Visual Studio&br()Visual C++&br()Visual C++ のリファレンス&br()C/C++ Languages&br()Compiler Intrinsics&br()MMX, SSE, and SSE2 Intrinsics
-通信用語の基礎知識
--http://www.wdic.org/w/SCI/MMX MMX
--http://www.wdic.org/w/SCI/SSE2 SSE2
-http://docs.sun.com/app/docs/doc/817-5477/6mkuavhrn?l=ja&a=view
-http://www.icnet.ne.jp/~nsystem/simd_tobira/index.html
-スレ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)
#comment()