sse4.2 的字符串操作指令

前段时间实现了基于 Succinct Data Structure 的自动机,这种自动机(内存)存储方式将状态转移的 label 单独存储起来,从而,查找 label 就是一个在 byte 数组中查找 byte 的操作,并且,绝大多数情况下,需要查找的这个 byte 数组都非常短(状态的平均转移(label)数一般情况下大约是 2 )。
于是,我发现了 _mm_cmpestri  intrinsic 函数(会被编译器翻译成 pcmpestr 指令):

intel 官方资料说这个函数的 latency 是 7~11 个 CPU clock,是相当快的了,虽然还是比一般的简单指令慢,但是比除法指令要快5~10倍!

有趣的是,在使用这条指令时,触发了 gcc-4.7 的一个bug (当时把它发在了新浪微博上):

sse4.2 指令 pcmpestri 的操作数可以是内存或 xmm 寄存器,一个操作数是内存时,不要求内存对齐。但 load xmm 寄存器需要内存对齐,gcc -O0 不优化,于是产生了一条 load xmm 和一条 pcmpestr xmm1 xmm2 指令,结果在 load xmm 时 SegFault 了!

换 -O2,省掉了 load xmm 指令, 生成 pcmpestr memptr xmm 指令,一切 OK。

intel icc 编译器则无此问题

实际的 byte 查找函数

当然,在实际中,如果转移数大于等于32,就直接用位图 + popcnt 来查找了。

作者:
该日志由 rockeet 于2014年07月01日发表在C++, 自动机分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
转载请注明: sse4.2 的字符串操作指令
标签:
【上一篇】
【下一篇】

您可能感兴趣的文章:

发表评论

您必须 登录 后才能发表评论。