Re: [問題] 有關sse取值的問題
※ 引述《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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
Programming 近期熱門文章
PTT數位生活區 即時熱門文章