dieyushi's Blog

ATOM Rss

sse4.2带来的优化

August 16 2013 , coding

前言

最近这一周做的事情是想办法让字符串处理的相关函数变的更快,为了应对大数据量的字符串处理。经过一段时间的努力,还算有点效果,可以比使用标准库要快的多。整个过程主要用到的是Intel的SSE 4.2中字符处理的相关指令,PCMPISTRIPCMPISTRM,下面稍微总结下。

Aggregation operations

这是这个指令比较核心的内容,通过imm[3:2]来设置。

Equal Each, imm[3:2] = 10b, 比较两个字符串,例子如下

operand1 = "UseFlatAssembler"
operand2 = "UsingAnAssembler"
IntRes1  =  1100000111111111

Equal Any, imm[3:2] = 00b, 直接看例子吧。

operand2 = "You Drive Me Mad"
operand1 = "aeiouy"
IntRes1  =  0110001010010010

Ranges, imm[3:2] = 01b, 判断一个字符是否子啊某一个范围。

operand2 = "I'm here because"
operand1 = "azAZ"
IntRes1  =  1010111101111111

Equal Ordered, imm[3:2] = 11b, 判断是否是字串。

operand2 = "WhenWeWillBeWed!"
operand1 = "We"
IntRes1  =  000010000000100

结果会写到ECX或者xmm0, 同时会影响CF,ZF等一些标志位,具体的可以看参考中intel的手册。

注意事项

  • 使用这个指令时字符串不需要对齐
  • CPU会处理'\0'字符的
  • 可以使用这条指令来处理宽字符
  • PCMPISTRI返回的是index,PCMPISTRM返回的是mask

总结

这两条指令可以用来实现strlen,strchr,strstr,strcmp等一些函数,glibc也的确用到了这些指令,但是它在实现是考虑的事项太多了,对于我们架构已经固定的应用,可以做很多很多针对性的优化的。代码就不贴了。。

参考

comments powered by Disqus