gpt4 book ai didi

sse - 可能使用 SSE/SSE2/SSE3/SSE4 指令从多个数字创建位掩码的有效方法

转载 作者:行者123 更新时间:2023-12-01 01:19:53 30 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

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

关于sse - 可能使用 SSE/SSE2/SSE3/SSE4 指令从多个数字创建位掩码的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10068541/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com