CUDA:共享内存的原子操作

时间:2012-02-03 10:45:07

标签: cuda gpu-atomics gpu-shared-memory


我的cuda内核生成了一些在块执行结束时被送到主机的东西。
骨架如下 写入数据的host_data被分配为主机映射内存 host_data_count也是映射内存,表示生成的数据的数量 我正在使用的GPU是带有Fermi架构和CC 2.0的GTX 580。

__global__ void kernel(host_data, host_data_count)
{
    __shared__ int  shd_data[1024];
    __shared__ int  shd_cnt;
    int i;

    if (threadIdx.x == 0)
        shd_cnt = 0;
    __syncthreads();

    while ( ... )
    {
        if (something happens)
        {
            i = atomicAdd(&shd_cnt, 1);
            shd_data[i] = d;
        }
    }

    __syncthreads();
    if (threadIdx.x == 0)
    {
        i = atomicAdd(host_data_count, shd_cnt);
        memcpy(&host_data[i], shd_data, shd_cnt * 4);
    }
}

我在这个内核代码中缺少什么?
有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

很难说你错过了什么,因为你并没有真正陈述你面临的问题。我看到几种可能性,但这取决于你的一些更高概念的实际实现。

  • 我假设host_data_count类型为int*(或类似?)。它指向全局内存,或通过映射固定内存来托管内存。我强烈建议为了速度而实际使用全局内存。
  • 如果host_data_count是固定内存,请记住,原子操作仅在GPU内是原子操作。如果在此期间,CPU对它做了一些事情,它可能会破坏原子性。在内核调用之后和读取/使用该值之前,您很可能需要同步主机线程。内核调用总是异步的。
  • 设备代码中的memcpy是什么?我假设你自己实现了,对吧?您是使用单个线程还是整个块复制内存?使用整个块会更快,但是您需要在if (threadIdx.x==0)之外使用此函数,并且必须共享变量i