Opencl 使用多个GPU+;CL-GL互操作缓冲区

Opencl 使用多个GPU+;CL-GL互操作缓冲区,opencl,Opencl,我用opencl实现了一个简单的代码,它使用16个多线程复制64MB的数据。内核如下所示: __kernel void myKernel( __global float4* a, __global float4* c, int count ){ int thread_idx = get_global_id(0); if (thread_idx >= count) return; c[thread_idx] = a[thread_idx]; } 我的电脑

我用opencl实现了一个简单的代码,它使用16个多线程复制64MB的数据。内核如下所示:

__kernel void myKernel(
  __global float4* a,
  __global float4* c,
  int count
  ){ 

  int thread_idx = get_global_id(0);
  if (thread_idx >= count) return;

  c[thread_idx] = a[thread_idx]; 
}
我的电脑有两个图形卡(GTX 980+GTX 970)和一个显示器。我正在使用Windows8.1。我在主机上创建了
c[…]
缓冲区,一次使用普通
clCreateBuffer
,另一次使用opengl创建gl缓冲区,另一次使用
clCreateFromGLBuffer
创建cl缓冲区。我的比较表明,使用
clCreateBuffer
创建的缓冲区速度始终相同,但在连接到显示器的gpu上创建的GL缓冲区速度要快得多,如图所示:

我的调查显示,
clEnqueueAcquireGLBuffer
使未连接到显示器的gpu上的一切都变慢了。有人见过这样的问题吗?你知道我该怎么修吗


完整的代码可以在这里找到:

这不是问题,只是一张卡有200 GB/s的带宽和vram到vram的拷贝。Pci-e通道(到非渲染卡)只有8-16 GB/s,对于小数据可能更小。如果您直接使用该共享缓冲区,那么就没有拷贝与pci-e拷贝的比较。你可以进行负载平衡,例如通过另一张卡只提供8MB的部分,在渲染设备上提供56MB的部分。我没有得到它。所以,问题是我将要生成的数据比这个还要大。据我所知,如果我在两个gpu上有两个cl上下文,gpu将始终工作得很快,但如果我们在一个gpu上创建一个上下文,另一个需要从拥有上下文的gpu传输数据,然后它会变慢。是否显示任何结果?带/不带显示,结果几乎是一样的。然后在与先前迭代相同的时间复制数据,这样您就可以将此时间减半。