__kernel void kmp(__global char pattern[1*4], __global char* string, __global int failure[1*4], __global int ret[1], int g_length, int l_length, int thread_num){
int pattern_num = 1;
int pattern_size = 4;
int gid = get_group_id(0);
int glid = get_global_id(0);
int lid = get_local_id(0);
int i, j, x = 0;
__local char *tmp_string;
event_t event;
if(l_length < pattern_size){
return;
}
event = async_work_group_copy(tmp_string, string+gid*g_length, g_length, 0);
wait_group_events(1, &event);
これは私のコードの一部です。ポインタでasync_work_group_copy()を使用していますか?
私はテキストに一致するパターンを見つけたいと思います。
最初に、CPU側ですべてのパターンと文字列(テキストから文字列を読み取り、実験的に1つのパターンのみを使用)を初期化します。
次に、それらをkmpという名前のカーネルに転送します。 (パラメータl_lengthとg_lengthはlidにコピーされ、それぞれglidになる文字列のサイズです。つまり、文字列)
最後に、分割された文字列をローカルメモリにコピーします。
しかし、問題があります。 async_work_group_copy()を使用してコピーすると、有効な結果が得られません。
__local char * tmp_stringを配列に変更すると、問題は残ります。
私がしたいのは、1)文字列を分割し、2)各スレッドにコピーして3)、一致する数値を計算します。
このコードで何が問題なのでしょうか。ありがとう!
ありがとう!しかし、私はあなたに混乱した情報を与えると思います。コードが実行される前に何も返さなかった。パラメータretは単なる名前です。計算後にCPUに戻しました。とにかく私はもう一度やります! ';私は'返す意味しましたSON.PARK @ –
。すべての作業項目はワークグループコマンドを実行する必要があります。 –
私は正しい結果を得ようとしました。しかし、スレッド数を44以上に増やしてもうまくいきませんでした。一致したパターンが私が意図したよりもはるかに少ないことを発見しました(443の一致した数字を見つけなければなりませんが、1つしか見つかりません)。この問題に関するお勧めはありますか?ありがとう! –