我的程序运行2个线程-线程A(用于输入)和B(用于处理)。我还有一对指向2个缓冲区的指针,因此,当线程A完成将数据复制到缓冲区1时,线程B开始处理缓冲区1,线程A开始将数据复制到缓冲区2中。然后,当缓冲区2已满时,线程A复制数据进入缓冲区1,线程B处理缓冲区2,依此类推。
当我尝试将cudaMemcpy Buffer []放入d_Buffer时出现问题(以前是cudaMalloc由主线程进行的,即在线程创建之前。Buffer []也由主线程进行了malloc的)。我收到“无效参数”错误,但不知道哪个是无效参数。
我已将程序简化为单线程程序,但仍使用2个缓冲区。也就是说,复制和处理是一个接一个地而不是同时进行的。 cudaMemcpy行与双线程行完全相同。单线程程序工作正常。
我不确定错误在哪里。
谢谢你。
问候,
雷恩
最佳答案
如果使用CUDA 3.2或更早版本进行此操作,则原因是GPU上下文绑定(bind)到特定线程。如果多线程程序从不同的主机线程在同一GPU上分配了内存,则分配结束时会建立不同的上下文,并且来自一个上下文的指针不能移植到另一个上下文。每个上下文都有其自己的“虚拟”内存空间来使用。
解决方案是使用上下文迁移API在工作时在线程之间传输单个上下文,或者尝试使用新的公共(public)CUDA 4.0rc2版本,该新版本应支持您不使用上下文迁移而要做的事情。缺点是4.0rc2是一个测试版本,它需要特定的beta版本驱动程序。该驱动程序将无法使用所有硬件(例如笔记本电脑)。
关于cudaMemcpy无效参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5616538/