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.
| 归档时间: |
|
| 查看次数: |
1854 次 |
| 最近记录: |