我开发的软件通常包括OpenGL和Nvidia CUDA SDK。最近,我也开始寻找优化运行时内存占用的方法。我注意到以下情况(Debug和Release版本之间仅相差4-7 Mb):
应用程序启动 - 小于1 Mb总计
OpenGL 4.5上下文创建(+ GLEW加载程序初始化)- 45 Mb总计
CUDA 8.0上下文(Driver API)创建114 Mb总计。
如果我在“无头”模式下创建OpenGL上下文,则GL上下文使用3 Mb以下,这可能会分配给默认帧缓冲区分配。这是有道理的,因为窗口大小为640x360。
因此,在OpenGL和CUDA上下文启动后,进程已经消耗了114 Mb。
现在,我对GL和CUDA上下文创建时在操作系统特定方面所发生的事情并不了解,但对于GL和CUDA来说,45 Mb和68 Mb似乎太多了。我知道通常有几兆字节用于系统帧缓冲区、函数指针(可能大量分配发生在驱动器侧)。但仅使用“空”上下文超过100 Mb看起来太多了。
我想知道:
应用程序启动 - 小于1 Mb总计
OpenGL 4.5上下文创建(+ GLEW加载程序初始化)- 45 Mb总计
CUDA 8.0上下文(Driver API)创建114 Mb总计。
如果我在“无头”模式下创建OpenGL上下文,则GL上下文使用3 Mb以下,这可能会分配给默认帧缓冲区分配。这是有道理的,因为窗口大小为640x360。
因此,在OpenGL和CUDA上下文启动后,进程已经消耗了114 Mb。
现在,我对GL和CUDA上下文创建时在操作系统特定方面所发生的事情并不了解,但对于GL和CUDA来说,45 Mb和68 Mb似乎太多了。我知道通常有几兆字节用于系统帧缓冲区、函数指针(可能大量分配发生在驱动器侧)。但仅使用“空”上下文超过100 Mb看起来太多了。
我想知道:
为什么GL/CUDA上下文创建会消耗如此大量的内存?
有没有优化的方法?
测试系统配置如下:
Windows 10 64位,NVIDIA GTX 960 GPU(驱动版本:388.31),8 GB RAM,Visual Studio 2015,64位C++控制台项目。
使用Visual Studio内置的诊断工具中的“进程内存”部分来测量内存使用情况。
更新:
根据datenwolf的建议,我尝试了Process Explorer。以下是我得到的截图(我的进程在底部,用黄色标记):
我希望能够对这些信息进行一些解释。我一直在查看“VS诊断工具”窗口中的“私有字节”。但是在这里,我还看到了“工作集”,“WS私有”等等。哪一个正确显示了我的进程当前使用的内存量?281,320K看起来太多了,因为如我所说,启动时该进程什么也不做,只是创建CUDA和OpenGL上下文。