cudaMemcpy参数无效

cudaMemcpy参数无效,cuda,buffer,nvidia,Cuda,Buffer,Nvidia,我的程序运行两个线程——线程A(用于输入)和线程B(用于处理)。我还有一对指向2个缓冲区的指针,因此当线程a将数据复制到缓冲区1中后,线程B开始处理缓冲区1,线程a开始将数据复制到缓冲区2。然后,当缓冲区2已满时,线程A将数据复制到缓冲区1,线程B处理缓冲区2,依此类推 当我试图将cudaMemcpy Buffer[]放入d_Buffer时,我的问题就出现了(在创建线程之前,它以前是由主线程进行cudaMalloc的。Buffer[]也是由主线程进行malloc的)。我得到一个“无效参数”错误,

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

当我试图将cudaMemcpy Buffer[]放入d_Buffer时,我的问题就出现了(在创建线程之前,它以前是由主线程进行cudaMalloc的。Buffer[]也是由主线程进行malloc的)。我得到一个“无效参数”错误,但不知道哪个是无效参数

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

我不确定错误在哪里

多谢各位

问候,,
Rayne

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


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

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