Выделение буфера нулевой копии на gpus arm mali midgard? - PullRequest
0 голосов
/ 21 октября 2019

Я хотел бы иметь нулевое поведение копирования для буферов opencl на arm mali midgard gpus и arm cpus, чтобы указатель данных вектора и clBuffer указывали на одно и то же местоположение в течение их времени жизни.

Некоторые из вещей, которыеЯ пытался. Я написал собственный распределитель (64-байтовое выравнивание) для вектора, а затем попытался использовать функцию cl_arm_import_memory и передать указатель вектора на функцию. Но проблема в том, что когда я запрашиваю свойства EXT устройства, я просто вижу строку cl_arm_import_memory, а не строку cl_arm_import_memory_host.

Я также попытался сначала выделить боковой буфер GPU, а затем заставить вектор указывать нарасположение буфера. Но согласно руководству по Мали, расположение буфера на стороне GPU может измениться так, что он может указывать на отдельные адреса при нескольких сопоставлениях.

Итак, мой вопрос заключается в том, каков наилучший способ достижения нулевого режима копирования между стандартным:: vector и и OpenCL буфер.

1 Ответ

0 голосов
/ 21 октября 2019

Я думаю, что вы смешиваете две несвязанные концепции: нулевое копирование и разделяемую виртуальную память. Нулевое копирование не гарантирует, что часть физической памяти будет видна по одному и тому же адресу как в CPU, так и в GPU - они могут по-разному отображаться в виртуальном адресном пространстве CPU и GPU. Если вы хотите, чтобы физическая память имела одинаковый виртуальный адрес в GPU и CPU, вам нужна общая виртуальная память (SVM). Для этого требуется OpenCL 2.x и распределение буферов через clSVMAlloc(). Если ваш поставщик не предоставляет OpenCL 2.x только 1.x, то вам не повезло - вы можете иметь нулевые буферы копирования, но не SVM.

...