2

cl_mem バッファーに格納されている長い文字列をカーネルに送信しています。

この長い文字列を個々の文字列に分割し、これをいくつかの一致処理の検索パターンとして使用します。

どうすればそれを達成できますか?

__kernel void SetHorspoolMatch(
                __global const char *haystack, 
                __global const char *needlesData){}

needlesData複数の異なる「針」に分割したい。

または、文字列の配列をホストからカーネルに移動して個別に使用するより良い方法はありますか?

4

1 に答える 1

1

私はこれをCUDAで行いました。4M ファイルを処理して 766K トークンに分割するには、NVidia GTX 560 カード (336 CUDA コア、メモリ帯域幅 128G バイト/秒) で約 40 ミリ秒かかります。これには、共有 (ローカル) メモリまたは定数メモリを使用する最適化はありません。

文字列がトークン文字と非トークン文字で構成されていると仮定しましょう。基本的な手法では、各文字を並行して調べます。

各スレッド (作業項目) は、2 つの隣接する文字に見えます。最初の文字が非トークンで、2 番目の文字がトークンの場合。次に、トークンの開始を見つけました。そのスレッドは、トークンの末尾または文字列の末尾が見つかるまで順方向にスキャンできます。長さ 1 の文字列を特別に扱い、文字列の最初の文字をプローブする必要があります (前の区切り文字はありません)。他のすべての組み合わせを拒否できます。

出力は 2 つの配列です。まずはスタートポジションです。2 番目の配列は長さです。出力配列への書き込みは、配列内で次に使用可能な位置を計算するアトミック add によって制御されます。このカウンターも出力パラメーターとして返されます。

経過時間の 95% がトークンのプローブに費やされます。ホスト-GPU メモリ転送に 5% が費やされます。

于 2013-08-08T22:29:30.983 に答える