cudaMallocHost(),cudaCreateEvent()是否与执行内核异步?

时间:2013-03-29 00:46:54

标签: cuda

我正在使用Cuda Runtime API运行一个非常奇怪的问题。调用cudaMallocHost()cudaEventCreate()cudaFree()等函数似乎只有在内核完成GPU执行时才会执行。此内核全部在使用cudaStreamNonBlocking标志创建的流上启动。问题是什么?我是否必须在某处张贴其他标志?

1 个答案:

答案 0 :(得分:1)

他们可以异步,但如果不是,就不会感到惊讶。

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

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

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

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

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