SSE 4.2 一次对两个16 字节的操作数进行比较。但也可以用普通处理器指令一次比较两个 8 字节的操作数。
差别不是那么大,才有这种比较的特殊硬件实现。SSE 4.2 如此无关紧要,还是我错过了什么?
x64 处理器仅保证具有 SSE2,您需要使用 CPUID 来检查 SSE 4.2 支持(通过CPUID.01H:ECX.SSE42[Bit 20] flag
),但是,SSE 2 支持 16字节比较,通过_mm_cmpeq_epi8
.
我不确定标准寄存器比较指令与其更广泛的 SSE 等效指令相比如何执行的细节(标准比较指令可能需要更多周期),但吞吐量提高 2 倍并没有什么可动摇的坚持。
我想你是在问“如果你得到的只是一次比较 2 次而不是 1 次,为什么还要 SSE 4.2?” 我认为你忽略了一些事情:
正如我之前提到的,两倍的宽度是很不错的。如果您正在开发一个进行大量此类比较的应用程序,您可能会对它的存在感到高兴。
将这条指令添加到已经存在的 SSE 执行单元的增量成本可能相对较小。已经有很多硬件可以执行已经为早期 SSE 指令集定义的各种操作。
如今,似乎添加的指令要么是旧功能的更广泛版本(例如许多 AVX 指令),要么是对某些特定应用程序很重要的操作(例如 CRC/AES 指令、4 元素点积)。可能有一些应用程序从这种比较指令中受益匪浅,并且添加它的成本值得通过在这些类型的代码上更快获得的营销收益。
虽然除了 4.2 之外的所有 SSE 确实都添加了“通常有用”的指令,但新的字符串操作非常通用,以至于它们在字符串处理之外也有潜在的用途。我不知道任何情况下这实际上有帮助,因为它们很慢。
SSE4.2 指令比较两个压缩操作数。因此,您不是在比较两个字节或单词,而是在 16 个字节和 16 个其他字节之间进行非常复杂的比较。(或 8 个单词和 8 个其他单词。)(每种情况下“最多 X”...)
SSE4.2 指令通常比正常比较慢,因为它们几乎总是微编码的。但是,鉴于每条 SSE4.2 指令开始时最多进行 256 次比较(在字节情况下),然后计算一堆更有用的输出,因此通常可以节省算法性能,除非您的搜索模式无法跳过几个每次迭代的字符。