Я запустил valgrind
для одного из моих OpenCL-кодов с открытым исходным кодом (https://github.com/fangq/mmc), и он обнаружил много утечек памяти в коде хоста OpenCL . Большинство из них указывало на строку , где я создал объект контекста, используя clCreateContextFromType
.
. Я дважды проверил все свои переменные OpenCL, очереди команд, ядра и программы и убедился, что они все правильно выпущены , но, тем не менее, при тестировании на примерах программ каждый вызов функции mmc_run_cl()
увеличивает память на 300-400 МБ и не освобождается при возврате.
вы можете воспроизвести отчет valgrind, выполнив следующие команды в терминале:
git clone https://github.com/fangq/mmc.git
cd mmc/src
make clean
make all
cd ../examples/validation
valgrind --show-leak-kinds=all --leak-check=full ../../src/bin/mmc -f cube2.inp -G 1 -s cube2 -n 1e4 -b 0 -D TP -M G -F bin
при условии, что в вашей системе установлены gcc / git / libOpenCL и valgrind. Измените вход -G 1
на другой номер, если вы хотите запустить его на других устройствах OpenCL (добавьте -L
в список).
В приведенной ниже таблице я перечисляю повторный счетчик каждой обнаруженной утечки valgrind на графическом процессоре NVIDIA (TitanV) на коробке Linux (Ubuntu 16.04) с самым последним драйвером + cuda 9.
Опять же, большинство утечек связано с линией clCreateContextFromType
, которая, как я полагаю, имеет некоторый объем памяти графического процессора не были выпущены, но я освободил все ресурсы GPU в конце кода хоста.
замечаете ли вы что-то, что я пропустил в коде хоста? Ваш вклад очень важен
counts | error message
------------------------------------------------------------------------------------
380 ==27828== by 0x402C77: main (mmc.c:67)
Code: entry point to the below errors
64 ==27828== by 0x41CF02: mcx_list_gpu (mmc_cl_utils.c:135)
Code: OCL_ASSERT((clGetPlatformIDs(0, NULL, &numPlatforms)));
4 ==27828== by 0x41D032: mcx_list_gpu (mmc_cl_utils.c:154)
Code: context=clCreateContextFromType(cps,devtype[j],NULL,NULL,&status);
58 ==27828== by 0x41DF8A: mmc_run_cl (mmc_cl_host.c:111)
Code: entry point to the below errors
438 ==27828== by 0x41E006: mmc_run_cl (mmc_cl_host.c:124)
Code: OCL_ASSERT(((mcxcontext=clCreateContextFromType(cprops,CL_DEVICE_TYPE_ALL,...));
13 ==27828== by 0x41E238: mmc_run_cl (mmc_cl_host.c:144)
Code: OCL_ASSERT(((mcxqueue[i]=clCreateCommandQueue(mcxcontext,devices[i],prop,&status),status)));
1 ==27828== by 0x41E7A6: mmc_run_cl (mmc_cl_host.c:224)
Code: OCL_ASSERT(((gprogress[0]=clCreateBufferNV(mcxcontext,CL_MEM_READ_WRITE, NV_PIN, ...);
1 ==27828== by 0x41E7F9: mmc_run_cl (mmc_cl_host.c:225)
Code: progress = (cl_uint *)clEnqueueMapBuffer(mcxqueue[0], gprogress[0], CL_TRUE, ...);
10 ==27828== by 0x41EDFA: mmc_run_cl (mmc_cl_host.c:290)
Code: status=clBuildProgram(mcxprogram, 0, NULL, opt, NULL, NULL);
7 ==27828== by 0x41F95C: mmc_run_cl (mmc_cl_host.c:417)
Code: OCL_ASSERT((clEnqueueReadBuffer(mcxqueue[devid],greporter[devid],CL_TRUE,0,...));
Обновление [04/11/2020]:
Читая комментарий @ doqtor, я провел следующий тест на 5 разностных устройствах, 2 графических процессора NVIDIA, 2 графических процессора AMD и 1 процессор Intel. То, что он сказал, было правильным - утечка памяти не происходит в библиотеке Intel OpenCL, я также обнаружил, что драйвер AMD OpenCL тоже подойдет. Единственная проблема заключается в том, что библиотека NVIDIA OpenCL, похоже, имеет утечку на обоих графических процессорах, которые я тестировал (Titan V и RTX2080).
Мои результаты испытаний приведены ниже. Профилирование памяти / ЦП с использованием psrecord введено в этом посте .
Я открою новый вопрос и щедрость о том, как уменьшить эта утечка памяти с NVIDIA OpenCL. Если у вас есть опыт в этом, пожалуйста, поделитесь. опубликует ссылку ниже. спасибо