我的程序运行2个线程 - 线程A(用于输入)和B(用于处理)。我还有一对指向2个缓冲区的指针,因此当线程A完成将数据复制到缓冲区1中时,线程B开始处理缓冲区1,线程A开始将数据复制到缓冲区2.然后当缓冲区2已满时,线程A复制数据到缓冲区1和线程B处理缓冲区2,依此类推。
当我尝试将cudaMemcpy Buffer []放入d_Buffer(之前由主线程进行cudaMalloc,即在线程创建之前,我的问题来了。缓冲区[]也被主线程malloc化)。我得到一个“无效参数”错误,但不知道哪个是无效参数。
我已将程序缩减为单线程程序,但仍使用2个缓冲区。也就是说,复制和处理一个接一个地发生,而不是同时发生。 cudaMemcpy行与双线程行完全相同。单线程程序工作正常。
我不确定错误在哪里。
谢谢。
此致 莱恩
答案 0 :(得分:5)
如果您使用CUDA 3.2或更早版本执行此操作,原因是GPU上下文与特定线程相关联。如果多线程程序在不同主机线程的同一GPU上分配内存,则分配最终会建立不同的上下文,而来自一个上下文的指针不能移植到另一个上下文。每个上下文都有自己的“虚拟化”内存空间可供使用。
解决方案是使用上下文迁移API将单个上下文从线程转移到线程,或者尝试新的公共CUDA 4.0rc2版本,这应该支持您尝试不使用的内容上下文迁移。缺点是4.0rc2是一个测试版本,它需要一个特定的beta版本驱动程序。所有硬件(例如笔记本电脑)都无法使用该驱动程序。