ARM Mali - Как разделить объект памяти только для чтения между процессором и графическим процессором одновременно?

Я использую ARM Mali T604 GPU. Я создал объект памяти, используя ALLOC_HOST_PTR. Я хотел бы знать, если следующая процедура действительна? Могу ли я получить доступ (только для чтения) к объекту памяти в графическом процессоре и сопоставить (только для чтения) один и тот же объект памяти в CPU одновременно?

Шаг 1: отключить объект памяти (ранее отображенный как CL_MAP_READ_WRITE)

Шаг 2: отобразите объект памяти обратно, используя CL_MAP_READ (аргумент для clEnqueueMapBuffer())

Шаг 3: читать и обрабатывать данные одновременно процессором и графическим процессором (но я не буду выполнять никаких операций записи для этого объекта памяти)

Шаг 4: разархивировать объект памяти

Шаг 5: сопоставьте объект памяти с помощью CL_MAP_READ_WRITE для размещения.

Другими словами, моя цель в конце дня состоит в том, чтобы иметь объект памяти, который может быть прочитан одновременно процессором и графическим процессором. Возможно ли это на платформе Mali OpenCL?

2 ответа

Решение

Это возможно не только в Mali GPU, это возможно в любой версии спецификации OpenCL и на платформах / устройствах, ваш подход верен и совместим с OpenCL 1.0.

Однако вы должны знать, что существует двойственность памяти (хост обращается к локальной копии, сгенерированной посредством операции карты, а не к данным реального GPU), и поэтому вы не экономите память, сохраняя массив в формате буфера OpenCL, если это было ваше намерение

В качестве примера: если вы записываете данные из ядра в эту память во время отображения, процессор все равно будет считывать старые данные, пока вы снова не отобразите / отобразите для чтения.

В спецификации OpenCL 1.2
5.4.3 Доступ к отображенным областям объекта памяти

Множественные команды в очередях команд могут отображать область или перекрывающиеся области объекта памяти и связанных объектов памяти (объекты суббуфера или объекты буфера 1D изображения, которые перекрывают эту область) для чтения (т.е. map_flags = CL_MAP_READ). Содержимое областей объекта памяти, отображаемых для чтения, также может быть прочитано ядрами и другими командами OpenCL (такими как clEnqueueCopyBuffer) выполнение на устройстве (ах).

Другие вопросы по тегам