2012-06-19 2 views
1

Предположим, что система с двумя отдельными графическими процессорами, но от одного и того же поставщика, поэтому к ним можно получить доступ с единой платформы OpenCL. Учитывая следующий упрощенный OpenCL код:Чтение/запись буферов памяти OpenCL на нескольких графических процессорах в одном контексте

float* someRawData; 

cl_device_id gpu1 = clGetDeviceIDs(0,...); 
cl_device_id gpu2 = clGetDeviceIDs(1,...); 
cl_context ctx = clCreateContext(gpu1,gpu2,...); 

cl_command_queue queue1 = clCreateCommandQueue(ctx,gpu1,...); 
cl_command_queue queue2 = clCreateCommandQueue(ctx,gpu2,...); 

cl_mem gpuMem = clCreateBuffer(ctx, CL_MEM_READ_WRITE, ...); 
clEnqueueWriteBuffer(queue1,gpuMem,...,someRawData,...); 
clFinish(queue1); 

В конце выполнения, будет someRawData быть как на GPU в памяти или это будет только на gpu1 в памяти?

+1

Я уверен, что данные хоста будут скопированы только в gpu1 ... Я не уверен, что на обоих устройствах будет выделено пространство. Спецификация здесь не очень помогает. У меня есть система с двумя графическими процессорами на работе - я постараюсь сделать это завтра, если у меня будет время. –

ответ

1

Это зависит от реализации, когда данные будут после вызова clFinish(), но, скорее всего, это будет на GPU, на который ссылается очередь. Кроме того, этот вид абстракции позволяет получить доступ к gpuMem из ядра, запущенного по адресу queue2 без явной передачи данных.

Смежные вопросы