我有一个多次调用的cuda内核,它将一些值添加到分配大小为N的数组中。我使用一个设备变量跟踪插入的元素,其中我应用了atomicAdd。
当添加值的数量接近N时,我希望能够知道它,这样我就可以再次调用cudaMalloc并重新分配数组。最明显的解决方案是每次调用内核时都要对该设备变量执行cudaMemcpy,因此要跟踪主机中数组的大小。我想知道的是,当值接近N时,是否有办法只能对主机执行cudaMemcpy。
我想到的一个可能的解决方案是,如果我可以将cudaError_t返回值设置为30(cudaErrorUnknown),或者我可以稍后检查一些自定义错误。但我还没有找到如何做到这一点,我想这是不可能的。有没有办法做我想做的事情,只有当设备发现内存耗尽时才进行cudaMemcpy?
答案 0 :(得分:1)
但我还没有找到如何做到这一点,我想这是不可能的
运行时的错误号由主机驱动程序设置。程序员无法使用它们,也无法在内核中设置它们。所以你的猜测是正确的。设备中有可用于调试的断言,并且有一些方法可以导致内核异常中止,但后者会导致上下文破坏并丢失设备内存,我怀疑这对你没有帮助。
关于您可以做的最好的事情是使用映射主机或托管分配作为主机跟踪设备上已分配内存消耗的方式。然后您不需要显式memcpy并且延迟将被最小化。但在这种情况下,您需要在正在运行的内核上进行某种同步。