2

我正在使用 Cuda Runtime API 解决一个非常奇怪的问题。cudaMallocHost()对,cudaEventCreate()等函数的调用cudaFree()似乎仅在内核在 GPU 上完成执行时才执行。这些内核都在使用cudaStreamNonBlocking标志创建的流上启动。问题是什么?我必须在某处放置其他标志吗?

4

1 回答 1

2

它们可以是异步的,但如果它们不是异步的也就不足为奇了。

关于cudaMallocHost(),这需要为 GPU 映射主机内存:如果无法从预分配的池中满足分配,则必须编辑 GPU 的页表。如果驱动程序有一个限制,它不能编辑正在执行的内核的页表,我一点也不会感到惊讶。(特别是因为页表编辑必须由内核模式驱动程序代码完成。)

关于cudaEventCreate(),这确实应该是异步的,因为这些分配通常可以从预分配的池中得到满足。主要的障碍是改变行为会破坏依赖其当前同步行为的现有应用程序。

异步释放对象要求驱动程序跟踪提交给 GPU 的命令缓冲区中引用了哪些对象,并将实际的释放操作推迟到 GPU 完成处理它们之后。这是可行的,但我不确定 NVIDIA 是否完成了这项工作。

对于cudaFree(),不可能像 CUDA 事件那样跟踪引用(因为可以存储指针以供正在运行的内核读取和跟踪)。因此,对于应该解除分配和取消映射的大型虚拟地址范围,必须推迟释放,直到所有挂起的 GPU 操作都已执行。同样,可行,但我不确定 NVIDIA 是否完成了这项工作。

我认为 NVIDIA 通常希望开发人员能够解决这些入口点缺乏异步性的问题。

于 2013-03-29T12:39:18.763 回答