4

假设我在一个 128 位变量/寄存器中有 16 个 ascii 字符(因此有 16 个 8 位数字)。我想创建一个位掩码,其中这些位将是高位,其位位置(索引)由这 16 个字符表示。

例如,如果由这 16 个字符组成的字符串是"CAD...",则在位掩码中第 67 位、第 65 位、第 68 位等应为 1。其余位应为 0。有什么特别有效的方法使用 SIMD 指令?

我知道其中一种技术是这样的加法:2^(67-1)+2^(65-1)+2^(68-1)+... 但这需要大量的操作。如果可能的话,我想用一个/两个操作/指令来做。

请让我知道一个解决方案。

4

1 回答 1

4

SSE4.2 包含一条指令,几乎可以执行您想要的操作:PCMPISTRM 与立即操作数 0。其中一个操作数应包含您的 ASCII 字符,其他 - 一个常量向量,其值如 32、33、... 47。您得到导致 XMM0 的 16 个最低有效位。由于您需要 128 位,因此该指令应使用不同的常量向量执行 8 次(如果您只需要可打印的 ASCII 字符则为 6 次)。在每个 PCMPISTRM 之后,使用按位或将结果累加到某个 XMM 寄存器中。

这种方法有两个缺点:(1)您需要阅读 Intel 的架构软件开发人员手册以了解 PCMPISTRM 的详细信息,因为这可能是有史以来最复杂的 SSE 指令,以及(2)该指令非常慢(吞吐量为 1/2在 Nehalem 上,在 Sandy Bridge 上 1/3,在 Bulldozer 上 1/4),因此与“蛮力”方法相比,您几乎不会获得任何显着的速度提升。

于 2012-04-09T11:57:06.543 回答