長さが最大500文字の文字列と、サイズ200MBのテキストファイルがあります。テキストファイルの文字列を検索するためのプログラムをCUDAに書きたいと思います。私のテキストファイルが大きすぎます、私はデバイスのグローバルメモリに入れなければならないと思いますが、私の文字列はどうですか?共有され、一定でテクスチャなメモリの中で最高のものはどれですか?なぜ? また、私は最大2500のサイズの配列を持っています。どのタイプのデバイスメモリがそれを格納するのに適していますか?CUDA - 文字列内の文字列を検索するデバイスメモリ
答えて
ハーフワープ内のすべてのスレッドが検索文字列の同じ要素に同時にアクセスするようにカーネルを書き込むと仮定すると、定数メモリは良い結果をもたらす可能性があります。その場合に最適化されています。
はここでループが各スレッドは、検索文字列の異なる要素にアクセスしているように構成されている場合は、単純なベースラインの実装
...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タイミング機能は、あなたの友人です。フェルミのナイーブな実装については
:
は、グローバルメモリと定数メモリ内の検索文字列内のテキストファイルを保存します。テキストファイルと同じサイズの結果バッファを設定します。結果バッファをゼロで埋める。
ブロックあたりのスレッド数をtとし、検索文字列の長さと同じにします。グリッドディメンションを決定するには、テキストファイルのサイズとグリッドディメンションの制限64Kを考慮します。ファイル全体をカバーするには、xのサイズをたとえば10Kと選択します。次に、テキストファイルのサイズをxに分割し、結果を切り上げてyのディメンションを探します。したがって、200M/10K = 20K(64K以内)です。 tスレッドと(x,y)グリッドを持つカーネルを起動します。カーネルで
:
D = X + 1024×Yとしてテキストファイルにオフセットを計算します。
yディメンションは上記で切り上げられているため、実行終了時のカーネルの一部を中止する必要があります。 d + tがテキストファイルのサイズより大きい場合、スレッドを中止します。エルス
、検索文字列からインデックストンのスレッド負荷一つの文字を持っており、テキストファイル内のインデックストン + Dで一つの文字と比較します。文字が一致しない場合は、結果バッファにインデックスdを格納します。それ以外の場合は何も行いません。
カーネルが完了したら、結果バッファをThrustでスキャンします。 0の各位置は一致の開始点を示します。
- 1. 配列内の文字列を文字列で検索する
- 2. JavaScript:文字列内の文字列を検索する
- 3. 文字列の配列内の文字列を検索
- 4. C++の文字列内の文字列を検索します
- 5. 文字列の文字列の検索
- 6. 文字列のdjango検索文字列
- 7. 文字列内の数字の検索
- 8. RegEx文字列内の文字列を検索
- 9. 文字列配列アイテム要素内の文字列を検索する
- 10. 文字列内の文字のインデックスを検索しますか?
- 11. 文字列内の部分文字列の配列を検索します。
- 12. 配列に含まれる文字列の検索文字列
- 13. 別の文字列で文字列を検索するには?
- 14. Android:文字列内の特定の文字を検索
- 15. コード内の文字列リテラルの検索
- 16. Regex ruby - 配列内の文字列を検索して小文字にする
- 17. 文字列内の検索機能サブ
- 18. 文字列内の検索と置換
- 19. 文字列内のJquery検索ワード
- 20. サイクリック文字列を検索
- 21. 検索文字列のデータベース
- 22. のC# - 検索文字列
- 23. phpで文字列内の文字列を検索していますか?
- 24. データベース列の文字列を検索
- 25. 検索文字列アルゴリズム
- 26. リセットJqGrid検索文字列
- 27. FreeTextTableフィルタ検索文字列
- 28. 文字列検索アルゴリズム
- 29. 文字列検索&交換
- 30. 特定の文字列(VBA)の部分文字列の検索
文字列を共有メモリに直接入れることはできません。共有メモリはカーネルの実行中に実行中の各ブロックのスレッドにのみ配置できます。ソースメモリは、グローバル、定数またはテクスチャメモリでなければなりません。 – talonmies
CUDAについて学ぶためにこれを書いているのなら、それは良い問題です。しかし、CPUの実装よりもパフォーマンスが大幅に向上するとは思えません。少なくとも、通常の実装ではそうではありません。ただし、テキスト検索はさまざまな方法で最適化できます。良い出発点はhttp://en.wikipedia.org/wiki/String_searching_algorithmです。 –