我已经多次启动了一个内核,直到找到解决方案。解决方案将至少由一个块找到
因此,当一个块找到解决方案时,它应通知cpu找到解决方案,因此cpu打印该块提供的解决方案。
所以我目前正在做的是:
__global__ kernel(int sol)
{
//do some computations
if(the block found a solution)
sol = blockId.x //atomically
}
现在每次调用内核时我都会将sol复制回主机内存并检查其值。如果它设置为3例如,我知道blockid 3找到了解决方案,所以我现在知道解决方案的索引在哪里开始,并将解决方案复制回主机。
在这种情况下,使用cudaHostAlloc会更好吗?在每次内核调用时复制单个整数的值会减慢我的程序吗?
答案 0 :(得分:1)
从GPU发送副本到CPU然后等待其完成将使程序一点。请注意,如果您选择发送1个字节或1个字节,那将不会产生太大影响。在这种情况下,带宽不是问题,而是延迟。
但是启动内核确实会耗费一些时间。如果算法的“肉”在内核本身,我就不会花太多时间在那个单一的小转移上。
请注意,如果您选择使用映射内存,而不是使用cudaMemcpy
,则需要明确地将cudaDeviceSynchronise
(或cudaThreadSynchronise
与较旧的CUDA)屏障放在一起(如在阅读状态之前反对cudaMemcpy
处的隐含障碍。否则,在内核覆盖它之前,您的主机代码可能会先读取存储在固定内存中的旧值。