cudaMemcpy 无效参数

Posted

技术标签:

【中文标题】cudaMemcpy 无效参数【英文标题】:cudaMemcpy invalid argument 【发布时间】:2011-08-02 18:12:32 【问题描述】:

我的程序运行 2 个线程 - 线程 A(用于输入)和 B(用于处理)。我还有一对指向 2 个缓冲区的指针,这样当线程 A 完成将数据复制到缓冲区 1 时,线程 B 开始处理缓冲区 1,线程 A 开始将数据复制到缓冲区 2。然后当缓冲区 2 已满时,线程 A 复制数据进入缓冲区 1,线程 B 处理缓冲区 2,依此类推。

当我尝试将 cudaMemcpy Buffer[] 放入 d_Buffer 时,我的问题就出现了(这之前是由主线程 cudaMalloc'd,即在线程创建之前。Buffer[] 也是由主线程 malloc'd)。我收到“无效参数”错误,但不知道哪个是无效参数。

我已将我的程序简化为单线程程序,但仍使用 2 个缓冲区。也就是说,复制和处理是一个接一个地进行,而不是同时进行。 cudaMemcpy 行与双线程行完全相同。单线程程序运行良好。

我不确定错误在哪里。

谢谢。

问候, 雷恩

【问题讨论】:

【参考方案1】:

如果您使用 CUDA 3.2 或更早版本执行此操作,原因是 GPU 上下文与特定线程相关联。如果多线程程序从不同的主机线程在同一 GPU 上分配内存,则分配最终会建立不同的上下文,并且来自一个上下文的指针不能移植到另一个上下文。每个上下文都有自己的“虚拟化”内存空间可供使用。

解决方案是使用上下文迁移 API 在线程之间传输单个上下文,或者尝试新的公共 CUDA 4.0rc2 版本,它应该支持您尝试执行的操作,而无需使用上下文迁移。缺点是 4.0rc2 是一个测试版本,它需要一个特定的 beta 版本驱动程序。该驱动程序不适用于所有硬件(例如笔记本电脑)。

【讨论】:

谢谢!我找到了 cuCtxPushCurrent 和 cuCtxPopCurrent,它们是驱动程序 API。是否有用于上下文迁移的运行时 API?我可以在同一个程序中混合运行时和驱动程序 API 吗? 没有运行时 API 上下文管理例程,因为上下文在运行时 API 中是隐式/抽象的。但是,自从 CUDA 3.1 发布以来,是的,您可以安全地混合运行时和驱动程序 API 调用。您可能会发现使用驱动程序 API 创建上下文并将其从线程迁移到线程是最简单的,使用运行时 API 进行上下文中的其余操作。请注意,上下文迁移本身并不是免费的,它确实会增加一些延迟,但它是在 CUDA 4.0 之前做你想做的事情的官方方式 我想试试 CUDA 4.0。我是否只需在当前安装的 CUDA 3.2 上安装 CUDA 4.0?我需要删除任何东西吗,例如司机等?

以上是关于cudaMemcpy 无效参数的主要内容,如果未能解决你的问题,请参考以下文章

cudaMemcpy2DToArray 和 cudaMemcpy2DFromArray 中的“音高”是啥

cudaMemcpy2D 导致段错误

当“cudaMemcpy”从设备到主机时,我是不是必须设置正确的设备?

CUDAMemcpy 对我来说毫无意义......为啥我要在普通 C++ 中指定设备内存?

带有嵌入对象/结构的 cudaMalloc/cudaMemcpy

cudaMemcpy 仍然无法托管设备分配的内存?