我在Cuda Runtime API上遇到了一个非常奇怪的问题。调用像cudaMallocHost()
,cudaEventCreate()
,cudaFree()
等功能似乎只在内核在GPU上完成执行时执行。此内核全部在使用cudaStreamNonBlocking
标志创建的流上启动。问题是什么?我必须在某处放置其他旗帜吗?cudaMallocHost(),cudaCreateEvent()与执行内核异步吗?
回答
他们可能被制作成异步,但如果它们不是异步的,那就不足为奇了。
关于cudaMallocHost()
,它要求主机内存映射到GPU:如果分配不能从预分配的池中满足,则必须编辑GPU的页表。如果驱动程序在无法编辑正在执行的内核的页表时遇到限制,我一点也不会感到惊讶。 (特别是由于页表编辑必须由内核模式驱动程序代码完成)。
关于cudaEventCreate()
,这实际上应该是异步的,因为这些分配通常可以从预分配的池中满足。主要障碍在于,改变行为会破坏依赖于当前同步行为的现有应用程序。
异步释放对象需要驱动程序跟踪提交给GPU的命令缓冲区中引用了哪些对象,并将实际的自由操作推迟到GPU完成处理之后。这是可行的,但我不确定NVIDIA已经完成了这项工作。
对于cudaFree()
,不可能跟踪CUDA事件的引用(因为可以存储指针以便运行内核来读取和追踪)。因此,对于应该解除分配和取消映射的大型视频地址范围,免费必须推迟到所有挂起GPU操作执行之后。再次,可以实现,但我不确定NVIDIA已经完成了这项工作。
我认为NVIDIA通常希望开发人员能够解决这些入口点缺乏异步的问题。
Uum这并不好...在我的系统中,我为一个内核准备环境并执行...然后我开始准备下一个异步...由于这种行为,我失去了性能,因为并非所有东西都是异步的:(有没有办法增加固定内存和事件池? – Daniel
我可以提供的唯一建议是实现自己的资源管理。:-( – ArchaeaSoftware
- 1. ASPNET核心和异步执行
- 2. 与Matlab异步执行
- 3. 异步步骤执行与黄瓜-JVM
- 4. 异步执行
- 5. 异步执行
- 6. node.js保存异步执行顺序吗?
- 7. LOAD DATA LOW_PRIORITY是异步执行的吗?
- 8. 用回调执行异步函数吗?
- 9. 如何在NSOperation内执行异步NSURLConnection?
- 10. jQuery - 异步执行
- 11. 异步PHP执行
- 12. Nodejs异步执行
- 13. PHP异步执行
- 14. 异步servlet不能异步执行
- 15. 并行内核执行
- 16. 并行内核执行
- 17. Java Spring异步执行
- 18. ANR执行异步任务
- 19. 执行异步方法
- 20. 异步执行命令
- 21. 异步脚本执行PHP
- 22. 异步执行“ng-repeat”
- 23. C#:异步例程执行
- 24. angular2异步函数执行
- 25. 执行异步操作
- 26. 异步执行形成
- 27. Django +执行异步进程?
- 28. 执行sqlite查询异步
- 29. 使用WxWidgets异步执行
- 30. ASP.NET/WCF - 异步执行Server.Execute
cudaFree和cudaMalloc是同步的。 –
这不会告诉我很多:(有没有办法如何调用内核运行时执行的cudaMallocHost()等?我有一些内核需要几秒钟的时间,并且由于此问题而挂起了我的进程 – Daniel