6

現在、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を使用する方法に関する優れたリソース(上記のIntelの記事を除く)を見つけることに成功していませんでした。

私が試している現在の戦略は、16バイトごとに4つのビットマスクを作成することです。

  • 区切り文字に対して各文字を一致させるもの
  • 各文字を改行文字と一致させるもの
  • 各文字を引用文字(文字列)と照合するもの。と
  • 各文字をエスケープ文字と照合するもの(区切り文字、改行、引用符をエスケープする)

ビットマスクによって取得された情報を使用すると、CSVの各値のオフセットと長さを簡単に決定できます。

4

1 に答える 1

5

なぜビットマスクを使用しているのですか? これらすべてのイベントを 1 つの STTNI 命令でチェックし、返されたインデックスを使用して、返されたイベント (存在する場合) を処理するほうがよいのではないでしょうか?

(編集)もっと役に立てるようにしましょう...

(8ビット文字のヌル終了文字列を使用していると仮定します。そうでない場合はお知らせください。)

区切り文字、改行、引用符、およびエスケープを単一のレジスタに (null で終了する文字列として) 配置し、各値を使用するPCMPISTRMの代わりに PCMPISTRI を使用する方がよいと思います。示す必要があるコントロール ワードの場合: 符号なしバイト、Equal Any、Positive Polarity、Least。(確かに私はそれを正しく理解しました。)

次に、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"  

区切り文字をテストするための最適な順序を決めるのはあなたにお任せします。:)

命令を開発していたとき、組み込み関数を使用して上記の asm コードをコンパイラに生成させることができました。命令の作業を行ってからしばらく経ちましたが、平均的なコンパイラがうまく機能するかどうかはわかりません. (どのような結果が得られるかを聞くのは興味深いことです。)


ところで、命令のマスク バージョンにはあらゆる種類の用途がありますが、命令の「I」バージョンがオフセットを計算するため、何かの最初または最後を見つけるのに最適な選択ではありません。マスク バージョンは、他のよりエキゾチックなものの中で特定のアイテムを数えたり、処理したりするのに適しています。今、私はそれらを使って DNA 文字列の A、CG、T を数えています。

于 2012-10-05T20:09:01.800 に答える