我正在使用Cuda Runtime API运行一个非常奇怪的问题。调用cudaMallocHost()
,cudaEventCreate()
,cudaFree()
等函数似乎只有在内核完成GPU执行时才会执行。此内核全部在使用cudaStreamNonBlocking
标志创建的流上启动。问题是什么?我是否必须在某处张贴其他标志?
答案 0 :(得分:1)
他们可以异步,但如果不是,就不会感到惊讶。
关于cudaMallocHost()
,它要求为GPU映射主机内存:如果无法从预分配池中满足分配,则必须编辑GPU的页表。如果驱动程序有一个限制,它无法编辑执行内核的页表,那么我至少不会感到惊讶。 (因为页表编辑必须由内核模式驱动程序代码完成。)
关于cudaEventCreate()
,这确实应该是异步的,因为通常可以从预分配的池中满足这些分配。主要障碍是改变行为会破坏依赖其当前同步行为的现有应用程序。
异步释放对象要求驱动程序跟踪提交给GPU的命令缓冲区中引用的对象,并推迟实际的自由操作,直到GPU完成处理为止。这是可行的,但我不确定NVIDIA是否完成了这项工作。
对于cudaFree()
,不可能像CUDA事件那样跟踪引用(因为可以存储指针以运行内核来读取和追逐)。因此,对于应该解除分配和取消映射的大型虚拟地址范围,必须延迟free,直到所有挂起的GPU操作执行完毕为止。再一次,可行,但我不确定NVIDIA是否完成了这项工作。
我认为NVIDIA通常希望开发人员能够解决这些切入点中缺乏异步的问题。