点对点Cuda内核-OpenGL互操作

点对点Cuda内核-OpenGL互操作,opengl,interop,cuda,p2p,Opengl,Interop,Cuda,P2p,我有两台geforce 680设备,它们之间启用并验证了对等访问。但是,我无法从设备1编辑设备0上的缓冲区。这是我的代码: // map 2 pixel buffer objects to primary device uchar4* dev0_buffer0=NULL; uchar4* dev0_buffer1=NULL; cudaSetDevice(0); cudaGLMapBufferObject((void**)&dev0_buffer0, m_pbo0); cudaGLMapB

我有两台geforce 680设备,它们之间启用并验证了对等访问。但是,我无法从设备1编辑设备0上的缓冲区。这是我的代码:

// map 2 pixel buffer objects to primary device
uchar4* dev0_buffer0=NULL;
uchar4* dev0_buffer1=NULL;
cudaSetDevice(0);
cudaGLMapBufferObject((void**)&dev0_buffer0, m_pbo0);
cudaGLMapBufferObject((void**)&dev0_buffer1, m_pbo1);
kernel<<< nBlocks, nThreads>>>(dev0_buffer0, width, height);

// write to a pbo on device 0 using device 1
cudaSetDevice(1);
kernel<<< nBlocks, nThreads>>>(dev0_buffer1, width, height);
设备0可以写入映射到它的两个缓冲区,但如果我尝试使用上面代码中的设备1写入其中一个缓冲区,则不会发生任何事情。没有错误或崩溃,它只是不影响我渲染到屏幕上检查的缓冲区


这是不可能的吗?

你试过使用GPUDirect吗?@marina.k:显然他们试过了-点对点访问是GPUDirect。我不知道答案,但我怀疑它不会起作用。它可能需要OpenGL上下文共享才能正常工作,而在过去,这意味着使用WGL_NV_gpu亲和性,这仅在Quadro卡上受支持。CUDA OpenGL缓冲区映射不会将地址注册到统一地址模型中,cudaSetDevice也不会更改OpenGL上下文,我猜这就是问题的根源。您还应该使用cudaGraphicsGLRegisterBuffer,因为cudaGLMapBufferObject已被弃用。