2013-02-25 4 views
2

У меня возникли проблемы с clCreateBuffer в OpenCL. Я работаю с процессором AMD Fusion (A10-5800k), поэтому оба устройства (CPU и GPU) должны иметь возможность работать с памятью друг друга.OpenCL: AMD Fusion и CL_MEM_USE_HOST_PTR

Для буфера чтения и результата я делаю:

bufRead = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, size, data, &err); 
bufWrite = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, size, result, &err); 

Когда я называю мое ядро, то «результат» массив не изменяется. Я знаю, что обычные графические процессоры будут копировать данные в память устройства и работать над этим. Стали бы обычные GPU копировать данные после этого?

Однако я надеялся, что Fusion GPU не скопирует данные, поскольку он может работать с одним и тем же указателем. К сожалению, я не вижу никаких изменений в массиве «результат». Когда я читаю «bufWrite» с clEnqueueReadBuffer, я вижу изменения. (Я делаю clFinish перед чтением «результата», поэтому данные должны быть записаны)

Кто-нибудь знает, как по-настоящему работать с одним и тем же массивом с процессором и графическим процессором? Я действительно хочу избежать clEnqueueReadBuffer.

Спасибо,

Tomas

+0

У меня нет времени, чтобы ответить на ваш вопрос прямо сейчас, но вот ответ я написал о APUs из некоторое время назад, которые могут помочь: http://stackoverflow.com/questions/12766578/access-path-in-zero-copy-in-opencl/12786498#12786498 – KLee1

ответ

3

ОК, я искал довольно долгое время для ответа. Это возможно, но только при определенных обстоятельствах.

Вам нужен графический процессор, на котором включена виртуальная память (виртуальная память). Вы можете проверить это с помощью clinfo. Посмотрите на «ВМ» в версии драйвера, например,

   Driver version: CAL 1.4.1695 (VM) 

У меня есть совершенно новый APU под Linux и VM не поддерживается. Я думаю, что он не поддерживается для всех графических процессоров под Linux. Я попробую Windows. Это правдоподобно, потому что для этого необходимо взаимодействовать с ОС. Надеюсь, поддержка Linux придет в будущем.

Во всяком случае, чтобы использовать его, вам нужно:

  1. Создайте буферы с CL_MEM_USE_HOST_PTR или CL_MEM_ALLOC_HOST_PTR.
  2. Получите доступ к буферу от хоста с помощью clEnqueueMapBuffer и отпустите его после чтения/записи с помощью clEnqueueUnmapMemObject.
  3. Когда VM включена, ничего не копируется, и у вас есть прямой доступ/без VM, он работает, но он скопирует данные.

ЗАКАНЧИВАТЬ Руководство по программированию AMD APP OpenCL Раздел 4.5.2 - Размещение

0

Я не уверен, я вас понимаю. В OpenCL (для любого типа целевой платформы, процессора или графического процессора) вызов clCreateBuffer будет выделять некоторую память на устройстве и скопировать данные из указателя узла на вновь выделенную память (хотя эта копия может выполняться только при вызове ядра с этим указатель как аргумент). Я не думаю, что хост и устройство могут работать в одной и той же памяти без «синхронизации» (иначе clEnqueueReadBuffer).

+0

Например, когда вы используете CPU с OpenCL (device == host = = CPU), и вы создаете буфер с CL_MEM_USE_HOST_PTR, память не копируется и вы работаете с фактическими данными. С AMD Fusion это также возможно для GPU (по крайней мере, я думаю, что это возможно) – Tomas

0

На некоторых платформах/устройствах достаточно позвонить clFinish, чтобы синхронизировать память хоста из памяти устройства. Призыв к clEnqueueReadBuffer, или clEnqueueMapBuffer требуется в общем случае. Указатель, возвращаемый clEnqueueMapBuffer, должен быть связан с хостом ptr, который вы предоставили при создании буфера.

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