【问题标题】:How to count the number of bytes which lies in some range using SSE?如何使用 SSE 计算某个范围内的字节数?
【发布时间】:2012-05-15 21:38:02
【问题描述】:

我想编写一个 c 程序,用下面的代码计算 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);   

我的方法正确吗?有没有更好的方法来做到这一点?

【问题讨论】:

  • 要计算相等字节数吗?如果是这样,你应该问它:-)
  • @drhirsch,我想计算位于某个范围(即 a 和 c 的范围)内的字节数。
  • 那你为什么不问呢? ;-) 我编辑了问题以进行澄清。

标签: x86 sse simd


【解决方案1】:

你的方法看起来很合理。我认为您可以通过在 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-22
    • 2023-01-13
    • 2021-07-02
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    相关资源
    最近更新 更多