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
) выполнение на устройстве (ах).