SSE 4.2 CSV文件解析

mue*_*bau 6 csv performance parsing sse

我正在研究如何使用SSE 4.2字符串和文本处理指令STTNI(http://software.intel.com/en-us/articles/xml-parsing-accelerator-with-intel-streaming-simd-extensions- 4-intel-sse4 /)用于高效的CSV文件解析.

我的问题是,如果之前已经尝试过CSV文件/内存中的CSV解析,并且在线提供了示例吗?到目前为止,我没有成功找到关于如何使用SSE 4.2进行文本解析的良好资源(除了上面提到的英特尔文章).

我正在尝试的当前策略是,对于每16个字节,创建4个位掩码:

  • 一个匹配分隔符的每个字符
  • 一个匹配换行符的每个字符
  • 一个匹配引号字符(字符串)的每个字符; 和
  • 一个匹配转义字符的每个字符(转义分隔符,换行符,引号)

利用位掩码获得的信息,可以轻松确定CSV中每个值的偏移量和长度.

小智 5

你为什么使用位掩码?使用单个STTNI指令检查所有这些事件并使用返回的索引处理返回的事件(如果有)是不是更好?

(编辑)让我试着更有帮助......

(我假设您正在使用8位字符的空终止字符串.如果情况不是这样,请告诉我.)

我认为你最好将分隔符,换行符,引号和转义放入单个寄存器(作为空终止字符串),并使用PCMPISTRI代替PCMPISTRM使用每个值.对于控制字,您需要指出:无符号字节,等于任意,正极性,最少.(很确定我做对了.)

然后,您可以使用JA同时检查是否有任何4个特殊字符被命中或是否到达字符串的末尾.如果是这样,请逃避循环以处理它.如果没有,将ECX添加到xmm2/m128指针并跳回PCMPISTRI.

处理"命中"的代码的第一条指令是将ECX添加到xmm2/m128指针,然后依次处理每种可能性.我建议从最不可能的地方订购它们.

因此,asm应该最终看起来像:

  XOR       ECX, ECX  

TAG1:
    ADD       EAX, ECX  
    PCMPISTRI XMM1, [EAX], 0x0     ; also writes ECX = index
    JA        TAG1  

ADD       EAX, ECX  
CMP       BYTE PTR[EAX], "delimiter"  
JE        "handle delimiter"  
CMP       BYTE PTR[EAX], "newline"  
JE        "handle newline"  
CMP       BYTE PTR[EAX], "quotation"  
JE        "handle quotation"  
CMP       BYTE PTR[EAX], "escape"  
JE        "handle escape"  
CMP       BYTE PTR[EAX], "end of string"  
JE        "handle end of string"  
Run Code Online (Sandbox Code Playgroud)

我会让你决定测试分隔符的最佳顺序是什么.:)

当我开发指令时,我曾经能够让编译器使用内在函数生成上面的asm代码.自从我完成指令工作已经有一段时间了,所以不确定普通编译器是否会运行良好.(听听你得到的结果会很有趣.)


顺便说一句,指令的掩码版本确实有各种用途,它们不是找到第一个或最后一个东西的最佳选择,因为指令的"I"版本将为你计算偏移量.掩模版本适用于计数或仅处理某些项目以及其他更奇特的东西.现在我用它们来计算DNA字符串中的A,CG和T.