2012-09-28 18 views
6

Obecnie badam, jak używać instrukcji SSE 4.2 i instrukcji przetwarzania tekstu STTNI (http://software.intel.com/en-us/articles/xml-parsing-accelerator-with- intel-streaming-simd-extensions-4-intel-sse4 /) dla wydajnego parsowania plików CSV.SSE 4.2 Przetwarzanie pliku CSV

Moje pytanie brzmi: czy to było wcześniej wypróbowane podczas analizy pliku CSV/pamięci CSV i czy przykłady są dostępne online? Do tej pory nie udało mi się znaleźć dobrych zasobów (z wyjątkiem wspomnianego wyżej artykułu Intela) na temat używania narzędzia SSE 4.2 do analizy tekstu.

Obecna strategia Próbuję to, za każde 16 bajtów, tworzyć 4 bitmasks:

  • jedną pasujących każdy znak przeciwko ogranicznika
  • jednej pasującej każdy znak przed znakiem nowej linii
  • jeden dopasowujący każdy znak do znaku cudzysłowu (ciągi); i
  • jeden dopasowując każdy znak przed znakiem ucieczki (ucieczki separatora, nowe linie, notowania)

z informacji uzyskanych przez bitmasks jest łatwy do określenia przesunięcia i długości dla każdej wartości w pliku CSV.

+2

Należy pamiętać, że znak cudzysłowu mógłby potencjalnie zostać usunięty, co prawdopodobnie będzie trudne w obsłudze z podejściem, które naszkicowałeś. –

+0

Z usuniętej odpowiedzi typu "tylko łącze": na [github: 'csvmonkey'] jest działająca (ale nie produkcyjna) implementacja (https://github.com/dw/csvmonkey). Biblioteka z nagłówkiem C++. Jest szybki, ale "na razie jest to w większości zabawkowy kod". Może dobry punkt wyjścia, z wyjątkiem tego, że nie ma na liście licencji. –

Odpowiedz

5

Dlaczego używasz bitmasek? Czy nie byłoby lepiej sprawdzić wszystkie te zdarzenia za pomocą pojedynczej instrukcji STTNI, a następnie użyć zwróconego indeksu do przetworzenia zdarzenia zwróconego (jeśli istnieje)?

(edit) pozwól mi spróbować być bardziej pomocny ...

(będę zakładać używasz NUL ciągi znaków 8-bitowych. Daj mi znać, jeśli to nie jest przypadek.)

Myślę, że lepiej byłoby umieścić separator, znak nowej linii, cytat i ucieczkę w jednym rejestrze (jako łańcuch zakończony znakiem zerowym) i użyć wartości PCMPISTRI zamiast PCMPISTRM przy użyciu każdej wartości. Dla słowa kontrolnego, które chcesz wskazać: Unsigned bytes, Equal Any, Positive Polarity, Least. (Jestem pewien, że mam to prawo).

Następnie można użyć JA, aby jednocześnie sprawdzić, czy któryś z 4 znaków specjalnych został trafiony lub czy osiągnięto koniec łańcucha. Jeśli tak, uciec z pętli, aby sobie z tym poradzić. Jeśli nie, dodaj ECX do wskaźnika xmm2/m128 i wróć do PCMPISTRI.

Pierwszą instrukcją kodu do czynienia z "trafieniem" jest dodanie wskaźnika ECX do xmm2/m128, a następnie przetwarzanie każdej z nich po kolei. Sugeruję zamawianie ich najprawdopodobniej najmniej.

Tak, ASM powinno zakończyć się szuka czegoś jak:

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" 

dam Ci zdecydować, co najlepsze zamówienie do testowania ograniczników jest. :)

Kiedy opracowywałam instrukcje, byłam w stanie zmusić kompilator do wygenerowania powyższego kodu asm przy użyciu intrisics. Minęło trochę czasu, odkąd wykonałem pracę z instrukcjami, więc nie jestem pewien, czy przeciętny kompilator dobrze sobie poradzi, czy nie. (byłoby interesujące usłyszeć, jakie wyniki uzyskasz.)


Nawiasem mówiąc, wersje maską instrukcji mają wszelkiego rodzaju zastosowań, oni po prostu nie są najlepszym wyborem dla znalezienia pierwszego lub ostatniego czegoś od „ja” wersje instrukcji obliczy przesunięcie dla ciebie. Wersje maski są dobre do liczenia lub przetwarzania tylko niektórych przedmiotów spośród innych, bardziej egzotycznych rzeczy. teraz używam ich do liczenia A, C G i T w łańcuchach DNA.

+0

Dzięki Mike, brzmi świetnie! Będę na bieżąco informować Cię o tym, co mogę wymyślić. – muehlbau