正在使用cudaHostAlloc对我的情况有好处

时间:2011-07-07 15:55:56

标签: c++ c cuda gpu gpgpu

我已经多次启动了一个内核,直到找到解决方案。解决方案将至少由一个块找到 因此,当一个块找到解决方案时,它应通知cpu找到解决方案,因此cpu打印该块提供的解决方案。
所以我目前正在做的是:

__global__ kernel(int sol)
{
   //do some computations
   if(the block found a solution)
        sol = blockId.x //atomically
}

现在每次调用内核时我都会将sol复制回主机内存并检查其值。如果它设置为3例如,我知道blockid 3找到了解决方案,所以我现在知道解决方案的索引在哪里开始,并将解决方案复制回主机。
在这种情况下,使用cudaHostAlloc会更好吗?在每次内核调用时复制单个整数的值会减慢我的程序吗?

1 个答案:

答案 0 :(得分:1)

从GPU发送副本到CPU然后等待其完成将使程序一点。请注意,如果您选择发送1个字节或1个字节,那将不会产生太大影响。在这种情况下,带宽不是问题,而是延迟。

但是启动内核确实会耗费一些时间。如果算法的“肉”在内核本身,我就不会花太多时间在那个单一的小转移上。

请注意,如果您选择使用映射内存,而不是使用cudaMemcpy,则需要明确地将cudaDeviceSynchronise(或cudaThreadSynchronise与较旧的CUDA)屏障放在一起(如在阅读状态之前反对cudaMemcpy处的隐含障碍。否则,在内核覆盖它之前,您的主机代码可能会先读取存储在固定内存中的旧值。