cudaMemcpy无效参数

Ray*_*yne 6 buffer cuda nvidia

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

当我尝试将cudaMemcpy Buffer []放入d_Buffer(之前是主线程的cudaMalloc,即在创建线程之前,我的问题来了.缓冲区[]也被主线程malloc化).我得到一个"无效参数"错误,但不知道哪个是无效参数.

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

我不确定错误在哪里.

谢谢.

此致,Rayne

tal*_*ies 5

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

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