2012-03-17 28 views
0

長さが最大500文字の文字列と、サイズ200MBのテキストファイルがあります。テキストファイルの文字列を検索するためのプログラムをCUDAに書きたいと思います。私のテキストファイルが大きすぎます、私はデバイスのグローバルメモリに入れなければならないと思いますが、私の文字列はどうですか?共有され、一定でテクスチャなメモリの中で最高のものはどれですか?なぜ? また、私は最大2500のサイズの配列を持っています。どのタイプのデバイスメモリがそれを格納するのに適していますか?CUDA - 文字列内の文字列を検索するデバイスメモリ

+1

文字列を共有メモリに直接入れることはできません。共有メモリはカーネルの実行中に実行中の各ブロックのスレッドにのみ配置できます。ソースメモリは、グローバル、定数またはテクスチャメモリでなければなりません。 – talonmies

+0

CUDAについて学ぶためにこれを書いているのなら、それは良い問題です。しかし、CPUの実装よりもパフォーマンスが大幅に向上するとは思えません。少なくとも、通常の実装ではそうではありません。ただし、テキスト検索はさまざまな方法で最適化できます。良い出発点はhttp://en.wikipedia.org/wiki/String_searching_algorithmです。 –

答えて

0

ハーフワープ内のすべてのスレッドが検索文字列の同じ要素に同時にアクセスするようにカーネルを書き込むと仮定すると、定数メモリは良い結果をもたらす可能性があります。その場合に最適化されています。

はここでループが各スレッドは、検索文字列の異なる要素にアクセスしているように構成されている場合は、単純なベースラインの実装

...load blocksize+strlen bytes of the file into shared memory... 
__syncthreads(); 
bool found = true; 
for (int i = 0; i < strlen; i++) { 
    if (file_chunk_in_sharedmem[threadIdx.x + i] != 
     search_str_in_constantmem[i]) 
    { 
     found = false; 
     break; 
    } 
} 
if (found) { 
    ...output the result... 
} 

のためのいくつかの擬似コードだ、1Dテクスチャメモリは速いかもしれません。

プロファイラーおよび/またはcudaタイミング機能は、あなたの友人です。フェルミのナイーブな実装については

1

は、グローバルメモリと定数メモリ内の検索文字列内のテキストファイルを保存します。テキストファイルと同じサイズの結果バッファを設定します。結果バッファをゼロで埋める。

ブロックあたりのスレッド数をtとし、検索文字列の長さと同じにします。グリッドディメンションを決定するには、テキストファイルのサイズとグリッドディメンションの制限64Kを考慮します。ファイル全体をカバーするには、xのサイズをたとえば10Kと選択します。次に、テキストファイルのサイズをxに分割し、結果を切り上げてyのディメンションを探します。したがって、200M/10K = 20K(64K以内)です。 tスレッドと(x,y)グリッドを持つカーネルを起動します。カーネルで

D = X + 1024×Yとしてテキストファイルにオフセットを計算します。

yディメンションは上記で切り上げられているため、実行終了時のカーネルの一部を中止する必要があります。 d + tがテキストファイルのサイズより大きい場合、スレッドを中止します。エルス

、検索文字列からインデックストンのスレッド負荷一つの文字を持っており、テキストファイル内のインデックストン + Dで一つの文字と比較します。文字が一致しない場合は、結果バッファにインデックスdを格納します。それ以外の場合は何も行いません。

カーネルが完了したら、結果バッファをThrustでスキャンします。 0の各位置は一致の開始点を示します。