2012-09-28 11 views
6

Attualmente sto studiando come utilizzare la stringa SSE 4.2 e le istruzioni di elaborazione testo STTNI (http://software.intel.com/en-us/articles/xml-parsing-accelerator-with- intel-streaming-simd-extensions-4-intel-sse4 /) per un'analisi efficiente dei file CSV.SSE 4.2 Analisi file CSV

La mia domanda è se questo è stato provato prima per l'analisi CSV file/in-memory CSV e se gli esempi sono disponibili online? Finora non ho avuto successo nel trovare buone risorse (tranne l'articolo Intel menzionato sopra) su come utilizzare SSE 4.2 per l'analisi del testo.

L'attuale strategia che sto cercando è quello di, per ogni 16 byte, creare 4 maschere di bit:

  • uno corrispondenti a ciascun carattere contro il delimitatore
  • una corrispondenza ciascun carattere contro il carattere di nuova riga
  • una corrispondente a ciascun carattere rispetto al carattere di citazione (stringhe); e
  • una corrispondenza ciascun carattere contro il carattere di escape (fuoriuscita di delimitazione, a capo, le citazioni)

con le informazioni ottenute dalle bitmasks è facile determinare le compensazioni e le lunghezze per ogni valore nel CSV.

+2

Si noti che il carattere di virgoletta potrebbe potenzialmente essere sfuggito, che probabilmente sarà difficile da gestire con l'approccio che hai tracciato. –

+0

Da una risposta di solo collegamento cancellata: Esiste un'implementazione funzionante (ma non di produzione pronta) su [github: 'csvmonkey'] (https://github.com/dw/csvmonkey). Libreria di intestazione C++. È veloce ma "Per ora è soprattutto un codice giocattolo". Forse un buon punto di partenza, tranne che non c'è nessuna licenza elencata. –

risposta

5

Perché stai usando le maschere di bit? Non sarebbe meglio controllare tutti questi eventi con una singola istruzione STTNI e quindi utilizzare l'indice restituito per elaborare l'evento restituito (se presente)?

(edit) vorrei provare a essere più utile ...

(darò per scontato che si sta utilizzando le stringhe con zero finale di caratteri a 8 bit. Fatemi sapere se questo non è il caso.)

Penso che farei meglio a mettere il delimitatore, la nuova riga, la citazione e l'escape in un unico registro (come stringa terminata da null) e usare PCMPISTRI invece di PCMPISTRM usando ogni valore. Per la parola di controllo che si desidera indicare: Byte non firmati, Uguale a Qualsiasi, Polarità positiva, Minima. (Piuttosto sicuro di aver capito bene.)

È quindi possibile utilizzare JA per verificare simultaneamente se uno dei 4 caratteri speciali è stato colpito o se è stata raggiunta la fine della stringa. Se è così, sfoglia il ciclo per affrontarlo. In caso contrario, aggiungere ECX al puntatore xmm2/m128 e tornare al PCMPISTRI.

Prima istruzione del codice per gestire un "colpo" è aggiungere ECX al puntatore xmm2/m128, quindi elaborare ciascuna possibilità a turno. Suggerisco di ordinarli dal più probabile al minimo.

Così, l'ASM dovrebbe finire cercando qualcosa di simile:

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" 

Ti lascerò decidere quale sia il miglior modo per delimitatori di test è. :)

Quando stavo sviluppando le istruzioni che ero solito essere in grado di ottenere il compilatore per generare il codice asm sopra usando intrinsics. È passato un po 'di tempo da quando ho lavorato con le istruzioni, quindi non sono sicuro che il compilatore medio funzionerà o meno. (Sarebbe interessante sapere quali risultati ottieni.)


Tra l'altro, le versioni maschera delle istruzioni non hanno tutti i tipi di usi, solo che non sono la scelta migliore per trovare il primo o l'ultimo di qualcosa dal momento che le versioni "I" delle istruzioni calcolerà l'offset per te. Le versioni di maschera sono buone per il conteggio o solo l'elaborazione di determinati oggetti tra altre cose più esotiche. in questo momento li sto usando per contare A, C G e T in stringhe di DNA.

+0

Grazie Mike, sembra fantastico! Ti terrò aggiornato su ciò che posso inventare. – muehlbau