我有以下代码段,尝试在其中增加称为SL的结构。在以下情况下,如何原子地递增相同值?如何避免比赛条件?我不在乎这种情况下实现的并行化。
__global__ void insertKernel(struct SlabList* head_ref, int* new_key, int* new_val, int size,struct SlabList* SL, struct SlabList* temp){
int id = blockIdx.x*blockDim.x + threadIdx.x;
if(id<size/SLAB_SIZE){
head_ref=NULL;
struct SlabList* new_node = (struct SlabList*)
malloc(sizeof(struct SlabList));
for(int j=0;j<SLAB_SIZE;j++){
new_node->key[j] = new_key[id*SLAB_SIZE+j];
new_node->val[j]= new_val[id*SLAB_SIZE+j];
}
new_node->next = head_ref;
memcpy(SL,new_node, size * sizeof(struct SlabList));
head_ref = new_node;
SL++;//How to perform this atomically?
}
我研究了CUDA的atomicInc
和atomicAdd
API,但是由于它们采用了不同的参数,因此无法继续进行操作。
答案 0 :(得分:1)
根据我的估算,只有原子执行(不更改代码结构),只有两项操作才能正确运行:突出显示SL
的增量和交换{{1 }}随树扩展的指针值。
如果(且仅当)使用的是64位操作系统,则可能会执行以下操作:
head_ref
[注意:从不编译或运行,更不用说测试了。使用风险自负]