假设我的机器上有2个支持OpenCL的设备(不包括CPU);并假设我的邪恶同事为他们每个人创建一个different上下文,我必须与之合作。
我知道I can't share buffers between contexts-至少不正确且不正式。但是,假设我创建了两个OpenCL缓冲区,每个缓冲区一个,并使用CL_MEM_USE_HOST_PTR
标志将它们传递给它们各自的主机内存的相同区域。例如:
enum { size = 1234 };
//...
context_1 = clCreateContext(NULL, 1, &some_device_id, NULL, NULL, NULL);
context_2 = clCreateContext(NULL, 1, &another_device_id, NULL, NULL, NULL);
void* host_mem = malloc(size);
assert(host_mem != NULL);
buff_1 = clCreateBuffer(context_1, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, size, host_mem, NULL);
buff_2 = clCreateBuffer(context_2, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, size, host_mem, NULL);
我意识到,officially,
在使用相同的
host_ptr
或重叠的主机区域创建的多个缓冲区对象上运行的OpenCL命令的结果被认为是未定义的。
但是,如果我从一个设备复制to缓冲区,然后将此缓冲区[[from复制到另一台设备,将会发生什么呢?我对(相对而言)AMD和NVIDIA GPU的情况特别感兴趣。
如果没有,那么您必须假设标准说了什么。