Копирование памяти занимает больше времени на GPU по сравнению с CPU - PullRequest
0 голосов
/ 05 марта 2020

У меня есть исходный и целевой указатели изображения для копирования. Когда я запускаю код для копии на процессоре, это занимает 2 мс. Теперь я запустил код для открытого cl с:

clCreateBuffer(context,CL_MEM_USE_HOST_PTR|CL_MEM_READ_WRITE,size,src_ptr,errcode_ret)
clCreateBuffer(context,CL_MEM_USE_HOST_PTR|CL_MEM_READ_WRITE,size,dst_ptr,errcode_ret)

и написал ядро ​​с глобальным размером рабочей группы (w, H). Поэтому каждое ядро ​​копирует пиксель. Это около 20 мс.

Может кто-нибудь, пожалуйста, помогите мне, как эффективно сделать копию памяти на открытых cl, когда у нас есть указатели изображений на глобальную память. Какой правильный размер рабочей группы использовать для этого процесса?

Ответы [ 2 ]

1 голос
/ 06 марта 2020

как эффективно выполнять копирование памяти на открытых 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. Вам нужно будет уточнить, что вы делаете, если вам нужен более полезный совет.

1 голос
/ 05 марта 2020

Можете ли вы помочь уточнить, что вы пытаетесь сделать sh? Вы пытаетесь сравнить время, необходимое для memcpy буфера хоста, со временем, которое требуется для копирования буфера устройства с использованием ядра графического процессора?

Если это так, попробуйте выделить буфер без флага CL_MEM_USE_HOST_PTR , Из первого ответа здесь кажется, что некоторые реализации отображают этот буфер в системную память вместо памяти устройства, что может замедлить копирование ядра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...