OpenCL Pipeline не удалось выделить буфер с cl_mem_object_allocation_failure - PullRequest
2 голосов
/ 27 марта 2019

У меня есть конвейер OpenCL, который обрабатывает изображения / видео, и иногда он может быть жадным с памятью. Это происходит сбой при распределении cl :: Buffer () следующим образом:

cl_int err = CL_SUCCESS;
cl::Buffer tmp = cl::Buffer(m_context, CL_MEM_READ_WRITE, sizeData, NULL, &err);

с ошибкой -4 - cl_mem_object_allocation_failure.

Это происходит в фиксированной точке моего конвейера с использованием очень больших изображений. Если я немного уменьшу изображение, оно будет проходить через конвейер в этой части, требующей большого объема памяти.

У меня есть доступ к карточке Nvidia с 4go, которая в определенный момент обанкротилась, а также попробовала на GPU AMD с 2go, который разорялся раньше.

В соответствии с этим потоком нет необходимости знать текущее распределение из-за обмена с VRAM, но, похоже, мой конвейер разрушает память моего устройства.

Так вот мой вопрос:

1) Есть ли на моем компьютере какие-либо настройки или конвейер для установки большего количества VRAM?

2) Можно ли использовать CL_DEVICE_GLOBAL_MEM_SIZE в качестве ссылки на максимальный размер для выделения, или мне нужно сделать CL_DEVICE_GLOBAL_MEM_SIZE - (локальная память + личная) или что-то в этом роде?

Согласно моему профилировщику памяти, у меня 92% от CL_DEVICE_GLOBAL_MEM_SIZE, выделенных при сбое. И, немного изменив размер, конвейер говорит, что я использовал 89% для измененного изображения, и оно прошло, поэтому я предполагаю, что мое большое изображение находится на грани прохождения.

1 Ответ

0 голосов
/ 31 марта 2019

Некоторые части VRAM вашего устройства могут использоваться для буфера пикселей, постоянной памяти или других целей. Для карт AMD вы можете установить переменные окружения GPU_MAX_HEAP_SIZE и GPU_MAX_ALLOC_PERCENT для использования большей части VRAM, хотя это может иметь непредвиденные побочные эффекты. Оба выражены в процентах вашей физически доступной памяти на карте. Кроме того, существует ограничение на размер для каждого выделения памяти. Вы можете получить максимальный размер для одного выделения памяти, запросив CL_DEVICE_MAX_MEM_ALLOC_SIZE, который может быть меньше CL_DEVICE_GLOBAL_MEM_SIZE. Для карт AMD этот размер можно контролировать с помощью GPU_SINGLE_ALLOC_PERCENT. Это не требует никаких изменений в вашем коде, просто установите переменные перед вызовом исполняемого файла:

GPU_MAX_ALLOC_PERCENT="100"
GPU_MAX_HEAP_SIZE="100"
GPU_SINGLE_ALLOC_PERCENT="100"
./your_program
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...