Неожиданное высокое использование оперативной памяти OpenCL - PullRequest
0 голосов
/ 07 мая 2020

Есть программа с определенным количеством ядер (около 30), которые работают с общими данными ( буферы - cl_mem ) и вызываются в определенной последовательности в al oop большом количестве раз (например, 100000). Объем данных, передаваемых на видеокарту, составляет около x * 10 МБ , но выделение памяти приложения (использование ОЗУ) достигает нескольких ГБ (как в диспетчере задач, так и в использовании памяти в Visual Studio).

Алгоритм следующий:

  • инициализация opencl (device, context, queue, programm)
  • загрузка исходных данных в RAM
  • выделение большого количества буферов для промежуточных данных cl_mem Xi = clCreateBuffer (...
  • перезагрузка исходных данных из ОЗУ в буфер с elquequeWriteBuffer (...
  • обозначение ядра - cl_kernel k_i = clCreateKernel (...
  • установка аргументов для каждого ядра - clSetKernelArg (...
  • обозначение размеров global и local для каждого ядра
  • запуск al oop с последовательностью исполняемого kenel с использованием clEnqueueNDRangeKernel (...
for (long int i=0; i<100000; i++) {
  err = clEnqueueNDRangeKernel (...
  err |= clEnqueueNDRangeKernel (...
  ...
  }
  • буфер чтения clEnqueueReadBuffer(

OpenCl считает все. Ожидаемый результат получен. Но использование памяти ЦП RAM растет ненормально / непропорционально количеству обработанных данных.

Я не понимаю. Я использую cl_mem Xi = clCreateBuffer (... только один раз, я не создаю буфер на каждой итерации, и я создаю эти буферы только в памяти графического процессора:

cl_mem buf_input = clCreateBuffer(context, CL_MEM_READ_WRITE, X * Y * sizeof(float), NULL, &err);

Почему так много использование памяти на хосте (CPU RAM)?

Я пробовал различные clRelease ... (..MemObj, ..Kernel, etc.). Также попробовал, чтобы программа полностью входила в l oop (т.е. с перегрузкой и повторным копированием cl-кода). Все хорошо, но память ... растет! И только память приложения. Объем оперативной памяти графического процессора составляет примерно x * 10 мегабайт.

1 Ответ

0 голосов
/ 10 мая 2020

Корзина go! &event - основная проблема!

Если я использую

err |= clEnqueueNDRangeKernel(queue, kernel17, 2, NULL, tGlobal_k17, tLocal_k17, 0, NULL, &event);

Увеличивается память хоста, но если я использую

err |= clEnqueueNDRangeKernel(queue, kernel17, 2, NULL, tGlobal_k17, tLocal_k17, 0, NULL, NULL);

память хоста в порядке!

...