有没有一种有效的方法可以使用SIMD内在函数在SIMD寄存器中获得第一个非零元素?

Mar*_*Zzz 6 x86 bit-manipulation simd intrinsics avx

如标题所示,如果256位SIMD寄存器是:

0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 |

我怎样才能最有效地获得第一个非零元素(即该指数的指数2第一的1)?最直接的方法是将其存储到内存中并逐个检查,但这可能会花费很多.有没有可爱的想法呢?

Pet*_*des 10

  • 针对全零寄存器的PCMPEQB/W/D/Q以获得具有对于零元素为全-1的元素的向量而对于零元素为全零的向量.
  • PMOVMSKB将全1或全零的向量转换为整数位掩码
  • 将(C ~运算符,asm NOT指令)反转为在位图中获得非零元素的1
  • TZCNT或BSF表示整数找到第一个设置位.如果输入全为零,请注意BSF的行为.

如果只有一个可能的非零值,PCMPEQ对应的向量,那么您以后不需要反转它.

如果是这种情况,请考虑首先将数据存储在位图中,以将缓存占用空间减少8倍.然后,您只需要TZCNT数组的64位块.


哎呀,刚刚注意到了内在标签.asm指令参考手册列出了每个条目底部的相关C内在函数,您可以通过asm助记符搜索英特尔的内在函数查找器.(有关链接,请参阅标记wiki).