Буферы с нулевым копированием с использованием расширения cl_arm_import_memory в OpenCL 1.2 - arm mali midgard GPU

Я хочу выделить вектор и использовать его указатель данных для выделения буфера нулевого копирования на графическом процессоре. Для этого можно использовать это расширение cl_arm_import_memory. Но я не уверен, поддерживается ли он для всех драйверов Mali Midgard OpenCL или нет.

Я просматривал эту ссылку и весьма озадачен следующие строки: -

Если раскрывается строка расширения cl_arm_import_memory_host, то поддерживается импорт из обычных распределений пользовательского пространства (например, созданных с помощью malloc).

Что именно означают эти строки? Я специально работаю над платами Rockchip RK3399. Пожалуйста, помогите.


person Community    schedule 20.10.2019    source источник


Ответы (1)


Если отображается строка расширения cl_arm_import_memory_host

Это означает, что вам необходимо проверить свойство CL_DEVICE_EXTENSIONS вашего устройства OpenCL с помощью _ 2_ функция. Разделите возвращаемую строку на имена расширений (они разделены пробелами), затем проверьте, является ли "cl_arm_import_memory_host" одной из этих строк.

Обратите внимание, что рассматриваемое расширение состоит из нескольких различных подфункций:

cl_arm_import_memory
cl_arm_import_memory_host
cl_arm_import_memory_dma_buf
cl_arm_import_memory_protected

Будет сообщено о cl_arm_import_memory, если также будет сообщено хотя бы об одной из других строк расширения.

Поэтому, если ваша реализация поддерживает импорт памяти хоста, в нем будут перечислены оба cl_arm_import_memory и cl_arm_import_memory_host.

Если поддерживается правильная функция, вам, вероятно, понадобится указатель на clImportMemoryARM() функцию расширения, вызвав clGetExtensionFunctionAddressForPlatform.

Затем используйте функции расширения, как описано в документации.

person pmdj    schedule 20.10.2019
comment
Привет, спасибо за ответ. Я проверил свойство CL_DEVICE_EXTENSIONS, и возвращенная строка состояла из cl_arm_import_memory, но не cl_arm_import_memory_host. Что это значит ? Могу ли я использовать выделенные буферы на стороне хоста и передать их функции ImportArmMemory? - person ; 21.10.2019
comment
@abhiverma Похоже, вам нужно специально протестировать подфункцию cl_arm_import_memory_host. Я обновил свой ответ критической цитатой из расширения: cl_arm_import_memory просто означает, что поддерживается по крайней мере одна из дополнительных функций, но вам необходимо дополнительно проверить конкретную из них, которая вам нужна. - person pmdj; 21.10.2019
comment
Итак, pmdj, как сделать тест специально для подфункции cl_arm_import_memory_host? Должен ли я реализовывать функцию и проверять результаты или есть другой способ? - person ; 21.10.2019
comment
Как я уже сказал, вам нужно проверить, указан ли "cl_arm_import_memory_host" в свойстве CL_DEVICE_EXTENSIONS. В противном случае эта часть расширения не поддерживается. По крайней мере, я так понимаю спецификацию расширения. - person pmdj; 21.10.2019
comment
если он показывает cl_arm_import_memory, то, насколько я понимаю, он должен поддерживать хотя бы одну из других подфункций, но когда я запрашиваю информацию об устройстве, ни одна из других подфункций не упоминается. - person ; 21.10.2019
comment
Хорошо, раньше это было непонятно, вы только что упомянули, что "cl_arm_import_memory_host" нет в списке. Похоже, у вас каким-то образом неисправен драйвер OpenCL. Если вы можете получить обновленный драйвер, я сначала попробую это сделать. В противном случае вы можете попытаться получить указатель на функцию; если это не удается, вы, очевидно, не сможете вызвать функцию. Если это удастся, вы можете попробовать использовать его для импорта памяти хоста и убедитесь, что вы проверили возвращаемое значение. Если это удастся и сработает - отлично. Если нет, то вам не повезло. - person pmdj; 21.10.2019
comment
Обратите внимание, что стандартный OpenCL также поддерживает флаг CL_MEM_USE_HOST_PTR для clCreateBuffer(), которого во многих реализациях будет достаточно для операции нулевого копирования. Однако нет гарантии, что это создаст буфер с нулевым копированием. - person pmdj; 21.10.2019
comment
Это полный список расширений, поддерживаемых моим устройством. - person ; 21.10.2019
comment
cl_khr_global_int32_base_atomics cl_khr_global_int32_extended_atomics cl_khr_local_int32_base_atomics cl_khr_local_int32_extended_atomics cl_khr_byte_addressable_store cl_khr_3d_image_writes cl_khr_fp64 cl_khr_int64_base_atomics cl_khr_int64_extended_atomics cl_khr_fp16 cl_khr_gl_sharing cl_khr_icd cl_khr_egl_event cl_khr_egl_image cl_khr_image2d_from_buffer cl_arm_core_id cl_arm_printf cl_arm_thread_limit_hint cl_arm_non_uniform_work_group_size cl_arm_import_memory - person ; 21.10.2019
comment
Поскольку рассматриваемое расширение указано последним: вы уверены, что предоставили достаточно большой буфер для clGetDeviceInfo()? Обратите внимание, что требуемый размер возвращается через параметр param_value_size_ret, поэтому, если ваш param_value_size меньше, чем то, что было возвращено в param_value_size_ret, ваш код должен выделить больший буфер и повторить попытку. - person pmdj; 21.10.2019
comment
Разве я не могу просто включить файл CL / cl_ext.h в мою программу драйвера и проверить его функцию? или я должен искать указатель функции. Нет, на моем устройстве USE_HOST_PTR не дает желаемого поведения. - person ; 21.10.2019
comment
Размер буфера не является проблемой, я использую заголовки C ++ и просто передаю std :: string для запроса информации об устройстве. - person ; 21.10.2019
comment
Я полагаю, что проверка наличия clImportMemoryARM в соответствии с методом слабого связывания для вашей платформы, поскольку он указан в заголовке cl_ext.h, должна работать, да. - person pmdj; 21.10.2019