cuda - cudaMallocHost() 、 cudaCreateEvent() 与执行内核异步吗?

标签 cuda

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

最佳答案

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

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

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

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

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

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

关于cuda - cudaMallocHost() 、 cudaCreateEvent() 与执行内核异步吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15694665/

相关文章:

c - 如何在CUDA程序中调试?输出异常

c++ - 错误 : taking reference of texture/surface variable not allowed in __device__/__global__ functions

c++ - CUDA:全局内存访问地址

python - 在 Tensorflow 中限制 GPU 设备

c++ - Cuda - 体系结构 x86_64 OS X 的 undefined symbol

c++ - cuda thrust::for_each with thrust::counting_iterator

c++ - 永恒赋值运算符调用循环C++模板类

c++11 - 无法摆脱 "warning: command line option ‘-std=c++11’“使用 nvcc/CUDA/cmake

cuda - 在 Maxwell GPU 上使用为计算能力 3.7 编译的 CUDA?

macos - 在没有 GPU 的 MAC OS X 上安装 CUDA(用于 cuda 模拟器)