避免CUDA字符串搜索中的分支发散

时间:2013-01-07 15:34:41

标签: c search cuda gpu

我想知道如何避免使用CUDA进行字符串搜索时的分支差异,以及是否有一个很好的方法。

目前我试图让Knuth Morris Pratt适应GPU,但我相信有很多分歧,因为每个帖子都在寻找N个字母并且每次比较这些字母是否与单词I'的第一个字母相对应我在寻找。

int tid = blockDim.x * blockIdx.x + threadIdx.x;
int startId = tid * 64;
int x = 0;
for(int i = 0; i < 64; i++){
    if(array[startId + i] == 'C'){
        x++;
    }
}

如果我使用这个虚拟代码来找到字母“C”,但我也可以再次查看搜索更多字母。

1 个答案:

答案 0 :(得分:1)

您可以尝试将比较结果直接添加到值中,如下所示:

x + =(array [startId + i] =='C');

但我相信这可能仍然分支。我的解决方案是将块中的数组值存储到共享内存中,然后为块中的每个线程分配一个所需的字符,并将结果放入它们自己的共享内存空间然后减少。

__shared__ char l_array[BLOCK_SIZE];
__shared__ char l_results[BLOCK_SIZE];

int bid = blockDim.x * blockIdx.x;
int lid = threadIdx.x;
int tid = bid + lid;
int x=0;

char desired_char = get_character(lid);


l_array[lid] = -1;


//Store global values in shared memory
if(tid < array_size){
    l_array[lid] = array[tid];       
}

__syncthreads();

//Check local memory for desired character
for(int i = 0; i < BLOCK_SIZE; i++)
   x+=(l_array[i] == desired_char);

//Store results into shared memory
l_results[lid] = x;

__syncthreads();
//Then reduce (poorly)
if(lid==0){
    for(int i = 0; i < BLOCK_SIZE; i++)
        x+= l_results[i];
}

虽然我本身并不知道算法,但我只是猜测,但这里的某些内容可能有助于你解决这个问题。