如何在CUDA内核内部的结构上执行原子操作?

时间:2019-04-07 12:02:55

标签: cuda

我有以下代码段,尝试在其中增加称为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的atomicIncatomicAdd API,但是由于它们采用了不同的参数,因此无法继续进行操作。

1 个答案:

答案 0 :(得分:1)

根据我的估算,只有原子执行(不更改代码结构),只有两项操作才能正确运行:突出显示SL的增量和交换{{1 }}随树扩展的指针值。

如果(且仅当)使用的是64位操作系统,则可能会执行以下操作:

head_ref

[注意:从不编译或运行,更不用说测试了。使用风险自负]