ile SSE karıştırılmış 32 bit değeri ayıklamak Verimli bir şekilde 128 bitlik bir kayıttan 4 bayt çıkarmaya çalışıyorum. Sorun, her değerin bir sperate 32bit {120,0,0,0,55,0,0,0,42,0,0,0,120,0,0,0}
olmasıdır. Ben 128 bit 32 bit dönüştürmek istiyorum form {120,55,42,120}
.Yalnızca SSE2
"ham" kod aşağıdaki gibi görünür:
__m128i byte_result_vec={120,0,0,0,55,0,0,0,42,0,0,0,120,0,0,0};
unsigned char * byte_result_array=(unsigned char*)&byte_result_vec;
result_array[x]=byte_result_array[0];
result_array[x+1]=byte_result_array[4];
result_array[x+2]=byte_result_array[8];
result_array[x+3]=byte_result_array[12];
Benim SSSE3 kodudur:
unsigned int * byte_result_array=...;
__m128i byte_result_vec={120,0,0,0,55,0,0,0,42,0,0,0,120,0,0,0};
const __m128i eight_bit_shuffle_mask=_mm_set_epi8(1,1,1,1,1,1,1,1,1,1,1,1,0,4,8,12);
byte_result_vec=_mm_shuffle_epi8(byte_result_vec,eight_bit_shuffle_mask);
unsigned int * byte_result_array=(unsigned int*)&byte_result_vec;
result_array[x]=byte_result_array[0];
Ben SSE2 ile bu verimli yapabiliriz nasıl. SSSE3 veya SSE4 ile daha iyi bir sürümü var mı?
Bu mükemmel bir cevaptır. İki kez nasıl kazanabilirim? :) bu bana çok yardımcı oldu. SSE4 ile daha iyi bir yol biliyor musunuz? –
@martins: SSSE3 ve üstü ile, sadece bir PSHUFB (mevcut kodunuzun derlemesi gereken). –
@martins SSE> 2'de bu kadar iyi eğitim almıyorum, belki de bakmaya çalışacağım. –