【发布时间】:2020-04-12 04:11:20
【问题描述】:
我对我的一个开源 OpenCL 代码 (https://github.com/fangq/mmc) 运行了 valgrind,它在 OpenCL host code 中检测到大量内存泄漏。大多数人都指向the line,我在其中使用clCreateContextFromType 创建了上下文对象。
我仔细检查了我所有的 OpenCL 变量、命令队列、内核和程序,并确保它们 are all properly released,但是,在对示例程序进行测试时,每次调用 mmc_run_cl() function 都会增加 300MB-400MB 的内存并且不会在返回时释放。
您可以通过在终端中运行以下命令来重现 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。如果您想在其他 OpenCL 设备上运行 -G 1 输入,请将其更改为不同的数字(将 -L 添加到列表中)。
在下表中,我列出了使用最新驱动程序+cuda 9 在 Linux 机器 (Ubuntu 16.04) 上的 NVIDIA GPU (TitanV) 上检测到的每个 valgrind 泄漏的重复计数。
同样,大多数泄漏与 clCreateContextFromType 行相关,我假设一些 GPU 内存没有释放,但我确实在主机代码末尾释放了所有 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 GPU、2 个 AMD GPU 和 1 个 Intel CPU 上进行了以下测试。他说的是正确的——英特尔 OpenCL 库不会发生内存泄漏,我还发现 AMD OpenCL 驱动程序也很好。唯一的问题是 NVIDIA OpenCL 库似乎在我测试的两个 GPU(Titan V 和 RTX2080)上都有泄漏。
我的测试结果如下。使用 psrecord 进行内存/CPU 分析已引入 in this post。
我将就如何使用 NVIDIA OpenCL 减少这种内存泄漏提出一个新问题和赏金。如果你有这方面的经验,请分享。将在下面发布链接。谢谢
【问题讨论】:
-
您是否尝试过使用minimal reproducible example 重现您的问题?
-
你试过我上面的 6 命令示例了吗?
-
这不是我可以编译的东西......另外问题是您是否首先使用最小可重现示例重现了您的问题?
-
我认为我的 6 命令示例代码是最小可重现示例 - 因为此报告的行为发生在当前代码库中,您可以使用我的命令重现它。如果无法编译,可以从mcx.space/nightly/linux64/mcxcl-linux-x86_64-nightlybuild.zip下载预编译的nightly build
-
我认为@doqtor 的意思可能是:您是否尝试过删除代码片段以缩小问题发生与未发生时的范围?也许这个网站上的某个人有时间阅读并完全理解您的 500LOC 函数,但如果您发布一段简化得多且更易于理解的代码,并显示出相同的问题,您更有可能获得帮助。
标签: performance debugging memory-leaks opencl valgrind