gpt4 book ai didi

cudaMemcpy 无效参数

转载 作者:行者123 更新时间:2023-12-04 15:15:19 28 4
gpt4 key购买 nike

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

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

关于cudaMemcpy 无效参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5616538/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com