メモ > SSE2

「メモ/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()

表示オプション

横に並べて表示:
変化行の前後のみ表示:
ツールボックス

下から選んでください:

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