【发布时间】:2018-05-07 20:32:06
【问题描述】:
我开发的软件通常包括 OpenGL 和 Nvidia CUDA SDK。最近,我也开始寻找优化运行时内存占用的方法。我注意到以下情况(调试和发布版本仅相差 4-7 Mb):
应用程序启动 - 总共不到 1 Mb
OpenGL 4.5 上下文创建(+ GLEW 加载程序初始化)- 45 Mb 总计
CUDA 8.0 上下文(驱动程序 API)创建总共 114 Mb。
如果我在“无头”模式下创建 OpenGL 上下文,GL 上下文会少用 3 Mb,这可能会用于默认帧缓冲区分配。这是有道理的,因为窗口大小是 640x360。
所以在 OpenGL 和 CUDA 上下文启动后,进程已经消耗 114 Mb。
现在,对于在 GL 和 CUDA 上下文创建过程中发生的操作系统特定的东西,我没有深入的了解,但是 45 Mb 的 GL 和 68 的 CUDA 对我来说似乎很多。我知道通常有几兆字节用于系统帧缓冲区、函数指针(可能大部分分配发生在驱动程序端)。但是仅使用“空”上下文达到 100 Mb 以上看起来太多了。
我想知道:
-
为什么 GL/CUDA 上下文创建会消耗如此大量的内存?
-
有没有办法优化它?
被测系统设置: Windows 10 64 位。 NVIDIA GTX 960 GPU(驱动程序版本:388.31)。 8 Gb 内存。 Visual Studio 2015,64 位 C++ 控制台项目。
我使用 Visual Studio 内置的诊断工具 -> 进程内存部分测量内存消耗。
更新
按照 datenwolf 的建议,我尝试了 Process Explorer。这是我得到的截图,(我的过程在底部标有黄色):
我将不胜感激有关该信息的一些解释。我总是在“VS 诊断工具”窗口中查看“私人字节”。但在这里我还看到“工作集”、“WS Private”等。哪一个正确显示了我的进程当前使用了多少内存? 281,320K 看起来太多了,因为正如我上面所说,启动时的进程什么都不做,而是创建了 CUDA 和 OpenGL 上下文。
【问题讨论】:
-
您使用的是哪个 CUDA API,何时测量内存占用?
-
驱动程序 API。正如我所说,我在进程启动后使用诊断工具进行测量。
-
但是您在测量时是否将任何内容加载到上下文中?
-
不,这就是我称之为“空”上下文的原因 :) 在 GL 情况下,我只加载了 API 函数指针 (GLEW)
-
@MichaelIV 1. 安装Process Explorer from Microsoft Technet 2. 在进程表中启动它后,右键单击表头 → 选择列 3. 在“进程内存”选项卡中选择“WS 可共享字节”并“WS 共享字节”(WS = 工作集) 4. 应用。您还可以为每个进程打开一个属性页,并在“性能”选项卡中查看共享了多少保留的工作集内存。
标签: windows opengl cuda operating-system cuda-context