2012-09-28 77 views
6

Actualmente estoy investigando cómo usar las Instrucciones de procesamiento de texto y cadenas de SSE 4.2 STTNI (http://software.intel.com/en-us/articles/xml-parsing-accelerator-with- intel-streaming-simd-extensions-4-intel-sse4 /) para un análisis eficiente de archivos CSV.SSE 4.2 Análisis de archivos CSV

Mi pregunta es si esto se ha intentado antes para el archivo CSV/en la memoria de análisis CSV y si hay ejemplos disponibles en línea? Hasta ahora no he tenido éxito en encontrar buenos recursos (excepto el artículo de Intel mencionado anteriormente) sobre cómo usar SSE 4.2 para el análisis de texto.

La estrategia actual que estoy tratando es, para cada uno de 16 bytes, crear máscaras de bits 4:

  • uno que coincida con cada personaje contra el delimitador
  • uno que coincida con cada personaje en contra del carácter de nueva línea
  • uno haciendo coincidir cada personaje con el carácter de cita (cadenas); y
  • uno que coincida con cada personaje contra el carácter de escape (escape delimitador, nuevas líneas, cotizaciones)

con la información obtenida por las máscaras de bits que es fácil de determinar las compensaciones y longitudes para cada valor de la CSV.

+2

Tenga en cuenta que el carácter de cita podría ser escapado, lo que probablemente será difícil de manejar con el enfoque que esbozó. –

+0

De una respuesta de solo enlace eliminado: Hay una implementación que funciona (pero no está lista para producción) en [github: 'csvmonkey'] (https://github.com/dw/csvmonkey). Biblioteca de encabezado C++. Es rápido, pero "por ahora es principalmente código de juguete". Tal vez sea un buen punto de partida, excepto que no hay una licencia en la lista. –

Respuesta

5

¿Por qué estás usando las máscaras de bits? ¿No sería mejor verificar todos esos eventos con una sola instrucción STTNI y luego usar el índice devuelto para procesar el evento devuelto (si lo hay)?

(editar) voy a tratar de ser más útiles ...

(Vamos a suponer que está utilizando cadenas de caracteres terminada en nulo de 8 bits. Quiero saber si ese no es el caso).

Creo que sería mejor poner el delimitador, la nueva línea, la cita y el escape en un solo registro (como una cadena terminada nula) y usar PCMPISTRI en lugar de PCMPISTRM usando cada valor. Para la palabra de control, querrá indicar: bytes sin signo, Igual cualquiera, Polaridad positiva, Mínimo. (Estoy bastante seguro de que lo entendí bien)

Puede usar JA para verificar simultáneamente si se tocó cualquiera de los 4 caracteres especiales o se llegó al final de la cadena. Si es así, escapa del circuito para lidiar con eso. De lo contrario, agregue ECX al puntero xmm2/m128 y regrese al PCMPISTRI.

La primera instrucción del código para tratar con un "golpe" es agregar ECX al puntero xmm2/m128, luego procesar cada posibilidad sucesivamente. Sugiero ordenarlos de lo más probable a lo menos.

Así, el ASM debe terminar buscando algo como:

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" 

voy a dejar que decida cuál es la mejor para que los delimitadores de prueba es. :)

Cuando estaba desarrollando las instrucciones, pude obtener el compilador para generar el código asm anterior utilizando intrínsecos. Ha pasado un tiempo desde que trabajé con las instrucciones, por lo que no estoy seguro si el compilador promedio funcionará bien o no. (Sería interesante escuchar los resultados que obtienes.)


Por cierto, las versiones de la máscara de las instrucciones no tienen todo tipo de usos, simplemente no son la mejor opción para encontrar la primera o la última de algo ya que las "I" versiones de las instrucciones calculará la compensación para usted. Las versiones de máscara son buenas para contar o procesar solo ciertos elementos entre otras cosas más exóticas. en este momento estoy usando para contar A, C G y T en las cadenas de ADN.

+0

Gracias Mike, ¡esto suena genial! Te mantendré actualizado sobre lo que puedo inventar. – muehlbau