您可以尝试将比较结果直接添加到值中,如下所示:
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];
}
虽然我不知道算法本身,但我只是猜测,但这里的一些东西可能会帮助你弄清楚这一点。