Есть программа с определенным количеством ядер (около 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 мегабайт.