我的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);
}
}
我在这个内核代码中缺少什么?
有人可以帮忙吗?
答案 0 :(得分:1)
很难说你错过了什么,因为你并没有真正陈述你面临的问题。我看到几种可能性,但这取决于你的一些更高概念的实际实现。
host_data_count
类型为int*
(或类似?)。它指向全局内存,或通过映射固定内存来托管内存。我强烈建议为了速度而实际使用全局内存。host_data_count
是固定内存,请记住,原子操作仅在GPU内是原子操作。如果在此期间,CPU对它做了一些事情,它可能会破坏原子性。在内核调用之后和读取/使用该值之前,您很可能需要同步主机线程。内核调用总是异步的。memcpy
是什么?我假设你自己实现了,对吧?您是使用单个线程还是整个块复制内存?使用整个块会更快,但是您需要在if (threadIdx.x==0)
之外使用此函数,并且必须共享变量i
。