2

範囲内のバイト数をカウントする ac プログラムを書きたいa...c以下のコードで:

char a[16], b[16], c[16];  
int counter = 0; 
for(i = 0;  i < 16; i++)  
{  
  if((a[i] < b[i]) && (b[i] < c[i]))  
  counter++;  
}  
return counter;  

私はこのようなことを計画しています

__m128i result1 = _mm_cmpgt_epi8 (b, a);  
__m128i result2 = _mm_cmplt_epi8 (b, c);  
unsigned short out1 = _mm_movemask_epi8(result1);  
unsigned short out2 = _mm_movemask_epi8(result2);  
unsigned short out3 = out1 & out2;  
unsigned short out4 = _mm_popcnt_u32(out3);   

私の方法は正しいですか?これを行うより良い方法はありますか?

4

1 に答える 1

4

あなたのアプローチはかなり合理的に見えます。次のように、SIMDレジスタ内でANDを実行することで、命令を保存できると思います。

__m128i result1 = _mm_cmpgt_epi8 (b, a);
__m128i result2 = _mm_cmplt_epi8 (b, c);
__m128i mask = _mm_and_si128(result1, result2);
int mask2 = _mm_movemask_epi8(mask);
int counter = _mm_popcnt_u32(mask2);
于 2012-05-15T21:55:20.983 に答える