2013-03-29 44 views
1

我在Cuda Runtime API上遇到了一个非常奇怪的问题。调用像cudaMallocHost(),cudaEventCreate(),cudaFree()等功能似乎只在内核在GPU上完成执行时执行。此内核全部在使用cudaStreamNonBlocking标志创建的流上启动。问题是什么?我必须在某处放置其他旗帜吗?cudaMallocHost(),cudaCreateEvent()与执行内核异步吗?

+3

cudaFree和cudaMalloc是同步的。 –

+0

这不会告诉我很多:(有没有办法如何调用内核运行时执行的cudaMallocHost()等?我有一些内核需要几秒钟的时间,并且由于此问题而挂起了我的进程 – Daniel

回答

1

他们可能被制作成异步,但如果它们不是异步的,那就不足为奇了。

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

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

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

对于cudaFree(),不可能跟踪CUDA事件的引用(因为可以存储指针以便运行内核来读取和追踪)。因此,对于应该解除分配和取消映射的大型视频地址范围,免费必须推迟到所有挂起GPU操作执行之后。再次,可以实现,但我不确定NVIDIA已经完成了这项工作。

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

+0

Uum这并不好...在我的系统中,我为一个内核准备环境并执行...然后我开始准备下一个异步...由于这种行为,我失去了性能,因为并非所有东西都是异步的:(有没有办法增加固定内存和事件池? – Daniel

+0

我可以提供的唯一建议是实现自己的资源管理。:-( – ArchaeaSoftware