x86 - 如何使用 SSE 计算某个范围内的字节数?

标签 x86 sse simd

我想编写一个计算范围a中的字节数的c程序... 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);   

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

最佳答案

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

关于x86 - 如何使用 SSE 计算某个范围内的字节数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10609188/

相关文章:

c++ - 使用 SIMD 优化列式最大值

c - 如何在汇编中使用 float ?

c++ - 将 int64_t 转换为 int 时,如何让 g++ 发出警告?

performance - SSE 4.2 CSV 文件解析

c++ - 使用 SSE/AVX 的整数点积?

c++ - 为什么在使用快速数学时 GCC 或 Clang 不优化 1 条指令的倒数

linux - 使用 FASM EQU 通过 $ - 符号计算出错误的大小 "len"

linux - 如何读取 x86 上的过时值

c - SSE 代码运行速度提高 30%,但在使用时显示 CPU 增加超过 20%

assembly - 如何在某处计算正弦值,然后移至汇编中的 XMM0 中?