【问题标题】:Returning custom cudaError or force copy to host from device返回自定义 cudaError 或从设备强制复制到主机
【发布时间】:2023-04-04 20:32:01
【问题描述】:

我有一个被多次调用的 cuda 内核,它将一些值添加到分配大小为 N 的数组中。我使用设备变量跟踪插入的元素,我在其中应用 atomicAdd。

当添加值的数量接近 N 时,我希望能够知道它,以便我可以再次调用 cudaMalloc 并重新分配数组。最明显的解决方案是每次调用内核时对该设备变量执行 cudaMemcpy,从而跟踪主机中数组的大小。我想知道的是,是否有一种方法可以仅在值接近 N 时对主机执行 cudaMemcpy。

我想到的一个可能的解决方案是,如果我可以将 cudaError_t 返回值设置为 30 (cudaErrorUnknown),或者一些自定义错误,我可以稍后检查。但我还没有找到怎么做,我想这是不可能的。有什么方法可以做我想做的事,只有当设备发现内存不足时才执行 cudaMemcpy?

【问题讨论】:

    标签: cuda


    【解决方案1】:

    但我还没有找到怎么做,我想这是不可能的

    运行时的错误编号由主机驱动程序设置。它们对程序员不可用,也不能在内核中设置。所以你的猜测是正确的。设备中有可用于调试的断言,并且有一些方法可以导致内核异常中止,但后者会导致上下文破坏和设备内存内容的丢失,我怀疑这对您没有帮助。

    您可以做的最好的事情是使用映射主机或托管分配作为主机跟踪设备上分配内存消耗的一种方式。然后你不需要显式地 memcpy 并且延迟将被最小化。但在这种情况下,您将需要在正在运行的内核上进行某种同步。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2013-09-20
      • 2011-09-09
      • 2012-09-29
      • 2013-08-30
      • 2017-08-27
      • 2020-03-07
      相关资源
      最近更新 更多