假设我在128位变量/寄存器中有16个ascii字符(因此有16个8位数字)。我想创建一个位掩码,其中这些位将为高位,其位位置(索引)由这16个字符表示。
例如,如果由这16个字符组成的字符串是"CAD..."
,则在位掩码第67位,第65位,第68位等等应为1.其余位应为0.是专门使用SIMD指令的有效方法吗?
我知道其中一项技术就是这样添加:2^(67-1)+2^(65-1)+2^(68-1)+...
但这需要大量的操作。如果可能的话,我想用一两个操作/指令来做。
请让我知道解决方案。
答案 0 :(得分:4)
SSE4.2包含一条指令,它几乎可以执行您所需的操作:PCMPISTRM具有立即操作数0.其中一个操作数应包含您的ASCII字符,其他 - 一个常量向量,其值为32,33,... 47。您将获得XMM0的16个最低有效位的结果。由于您需要128位,因此该指令应使用不同的常量向量执行8次(如果只需要可打印的ASCII字符,则执行6次)。在每个PCMPISTRM之后,使用按位OR将结果累积到某个XMM寄存器中。
这种方法有两个缺点:(1)您需要阅读英特尔架构软件开发人员手册以了解PCMPISTRM的详细信息,因为这可能是有史以来最复杂的SSE指令,并且(2)此指令相当慢(吞吐量为Nehalem是1/2,Sandy Bridge是1/3,Bulldozer是1/4),所以你几乎不会比'强力'方法有任何明显的速度提升。