这对于NVIDIA设备来说确实是一个问题。对于AMD卡,可以同时执行单个上下文中的多个命令队列,但是,NVIDIA OpenCL does not support this。必须在多个线程中创建多个上下文对象,以便同时在多个设备上运行内核。
创建多个上下文的缺点是必须多次创建所有cl_mem对象,每个上下文对应一个。
之类的东西 gmedia=(cl_mem *)malloc(workdevice*sizeof(cl_mem));
for(i=0;i<workdevice;i++){
OCL_ASSERT(((gmedia[i]=clCreateBuffer(mcxcontext[i],RO_MEM, sizeof(cl_uint)*(dimxyz),media,&status),status)));
...
}
如果有一个要复制的大型数组,这将变得非常耗费时间和内存。就我而言,内存复制开销占主导地位,并在启动内核之前消耗更多的GB内存。当我尝试通过8个GPU启动此内核时(我总共有11个GPU),代码因内存限制而崩溃。
我想知道是否有办法在OpenCL的多个设备上有效地共享只读缓冲区?
或者,有没有办法在使用NVIDIA OpenCL的多个设备上启动同时执行?
感谢