как эффективно выполнять копирование памяти на открытых cl, когда у нас есть указатели изображений на глобальную память
Эффективный способ - использовать memcpy()
на указателях хоста. Я использую ЦП.
, когда мы используем CL_MEM_USE_HOST_PTR, графический процессор может получить доступ к изображению напрямую из глобальной памяти вместо копирования из глобальной памяти
Это не совсем так. Это верно для встроенных графических процессоров (если указатель памяти host_ptr правильно выровнен). Дискретные графические процессоры по-прежнему будут копировать память хоста в собственную память по шине PCI express. Если вы читаете документацию для clCreateBuffer, она говорит:
CL_MEM_USE_HOST_PTR ... Реализациям OpenCL разрешено кэшировать содержимое буфера, на которое указывает host_ptr, в памяти устройства. Эта кэшированная копия может использоваться, когда ядра выполняются на устройстве.
Дискретные графические процессоры не могут напрямую «работать» с памятью хоста. Даже если бы они могли, это было бы настолько медленно, что было бы бессмысленно.
Фактически использование CL_MEM_USE_HOST_PTR с дискретным графическим процессором может привести к ухудшению производительности, поскольку графическому процессору придется поддерживать копию узла в syn c с собственной копией, что приведет к большому количеству переводов P CIe. CL_MEM_USE_HOST_PTR имеет смысл только с интегрированными графическими процессорами для сохранения ненужных передач и копий памяти.
Обычно вы работаете с графическими процессорами, чтобы минимизировать передачи памяти, поэтому вы создаете буферы один раз (с clCreateBuffer), затем запускаете нужные вам ядра на них, а затем либо передать результат обратно на хост (через enqueueReadImage), либо отобразить его с помощью взаимодействия OpenGL. Вам нужно будет уточнить, что вы делаете, если вам нужен более полезный совет.