【问题标题】:cudaMemcpy invalid argumentcudaMemcpy 无效参数
【发布时间】: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 行与双线程行完全相同。单线程程序运行良好。

我不确定错误在哪里。

谢谢。

问候, 雷恩

【问题讨论】:

    标签: cuda buffer nvidia


    【解决方案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?我需要删除任何东西吗,例如司机等?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 2017-03-28
    • 2021-01-25
    • 2016-07-07
    • 2014-07-06
    相关资源
    最近更新 更多