Re: [問題] 有關sse取值的問題

看板Programming作者 (フィーリア)時間15年前 (2010/11/12 12:20), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《wang71 (jack)》之銘言: : 各位大大,小弟目前在研究有關sse的加速 : 目前想寫一個兩個rgb像素(rgb為unsigned char) : 相減,取絕對值,在將最後的rgb相加 : 然後目前有使用到這個函數 : __m128i _mm_sad_epu8(__m128i a, __m128i b) : 只是目前有個問題是例如: : c = _mm_sad_epu8( a, b) : 但是要如何把c的值取出呢? : 一直沒看到相關的指令 : 希望各位大大幫忙~~~~ SSE有bit shifting的_mm_slli_si128()和_mm_srli_si128()的函數 PSLLDQ PSRLDQ <---組合語言 可以把你要的byte shift到最右邊,再挖出來 不過這樣取值很慢就是 要想得到SSE高效能的好處 正確的做法是 1.用union union內有__m128i時,用此union宣告的變數就會align 16byte void test1(){ typedef union{ __m128i v; unsigned char c[16]; }your_pixel4_type; your_pixel4_type z; your_pixel4_type y; your_pixel4_type x; for(int i=0;i<16;++i){ z.c[i]=i; y.c[i]=i; } __m128i a=_mm_load_si128(&z.v); __m128i b=_mm_load_si128(&y.v); __m128i c=_mm_srli_si128(a,1); _mm_store_si128(&x.v,c); for(int i=0;i<16;++i) printf("%d\n",x.c[i]); } 2. 用pointer,不過要注意,不能用libc內建的malloc() void test2(){ const int ALIGN=16; int *a,*b,*c; int a_length=128; a=(int*)_mm_malloc(sizeof(int)*a_length,ALIGN); b=(int*)_mm_malloc(sizeof(int)*a_length,ALIGN); c=(int*)_mm_malloc(sizeof(int)*a_length,ALIGN); for(int i=0;i<a_length;++i){ a[i]=i; b[i]=i; } // 普通pointer轉型成__m128i pointer __m128i* ma=(__m128i*)a; __m128i* mb=(__m128i*)b; __m128i* mc=(__m128i*)c; // 找到ma的結尾 int ma_length = a_length*sizeof(int)/ALIGN; __m128i* ma_end; ma_end = ma+ma_length; //ma,mb,mc都必須是pointer for(;ma<ma_end;++ma,++mb,++mc){ __m128i xmm0=_mm_load_si128(ma); __m128i xmm1=_mm_load_si128(mb); __m128i xmm2=_mm_add_epi32(xmm0,xmm1); _mm_store_si128(mc,xmm2); } for(int i=0;i<a_length;++i){ printf("%d\n",c[i]); } _mm_free(a); _mm_free(b); _mm_free(c); } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.30.54 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.30.54

12/02 11:23, , 1F
大大太強了,請界我轉貼小弟的部落格好嗎 ^^
12/02 11:23, 1F
文章代碼(AID): #1CtC2bnl (Programming)
討論串 (同標題文章)
文章代碼(AID): #1CtC2bnl (Programming)