尝试在内核代码中构建索引结构:
atomicCAS((int*)&index[val], -1, atomicAdd((unsigned int*)&index_pos, 1));
index []声明为动态共享内存数组,并初始化为-1,index_pos声明为volatile。
直觉如下:只有块中的第一个线程应初始化索引并增加index_pos。但是我注意到index_pos会因冲突的线程而多次递增。 为什么会这样?
答案 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"
}