在cuda中使用原子操作构建索引

时间:2014-01-19 22:05:47

标签: parallel-processing cuda gpgpu gpu-programming

尝试在内核代码中构建索引结构:

atomicCAS((int*)&index[val], -1, atomicAdd((unsigned int*)&index_pos, 1));

index []声明为动态共享内存数组,并初始化为-1,index_pos声明为volatile。

直觉如下:只有块中的第一个线程应初始化索引并增加index_pos。但是我注意到index_pos会因冲突的线程而多次递增。 为什么会这样?

1 个答案:

答案 0 :(得分:1)

我无法理解你的代码应该做什么,但是,我没有看到为什么变量index_pos不应该增加更多次的原因。将一个原子操作嵌套到另一个原子操作中不会产生复合原子操作。

示例:

atomicAdd(atomicAdd(x, 1), 1);

不作为

atomicAdd(x, 2);

但:

atomicAdd(x, 1);
atomicAdd(x, 1);

评论后编辑:

从评论中获取信息,我将通过以下代码确保所描述的功能:

if(index[val] == -1) { // this is just an optimization
    atomicCAS((int*)&index[val], -1, threadId); // initialization by the only thread
}

__threadfence_block();

if(index[val] == threadId) {
    index_pos++; //index_pos will be incremented only "once" 
}