Предположим, у меня есть 2 устройства с поддержкой OpenCL на моей машине (не включая процессоры); и предположим, что мой злой коллега создает другой контекст для каждого из них, с которым мне приходится работать.
Я знаю Я не могу разделить буферы между контекстами - не правильно и официально, по крайней мере. Но предположим, что я создал два буфера 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);
Я понимаю, что, официально ,
Результат команд OpenCL, которые работают с несколькими объектами буфера, созданными с тем же host_ptr
или перекрывающиеся регионы хоста считаются неопределенными.
Но что на самом деле произойдет, если я скопирую в этот буфер с одного устройства и из этого буфера на другое устройство? Я особенно заинтересован в случае (относительно недавних) графических процессоров AMD и NVIDIA.