0


我的 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);
    }
}

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

4

1 回答 1

1

很难说你错过了什么,因为你实际上并没有说明你面临的问题是什么。我认为可能性很小,但这取决于您的一些更高概念的实际实现。

  • 我假设 ahost_data_count是类型int*(或类似的?)。它要么指向全局内存,要么通过映射固定内存指向主机内存。为了速度,我强烈建议实际使用全局内存。
  • 如果host_data_count是固定内存,请记住,原子操作仅在 GPU 内是原子的。与此同时,如果 CPU 对其进行处理,它可能会破坏原子性。您很可能需要在内核调用之后和读取/使用该值之前同步主机线程。内核调用总是异步的。
  • memcpy设备代码中有什么?我假设您自己实现了它,对吗?您是使用单个线程还是整个块来复制内存?使用整个块会更快,但是你需要在外部使用这个函数if (threadIdx.x==0),并且变量i必须是共享的。
于 2012-02-05T13:31:09.047 回答