cudaMemGetInfo获取的显存占用与实际不符问题
问题:
在windows或者wsl下开发cuda程序时使用cudaMemGetInfo查询显存占用时会与nvidia-smi、gpu-z等查询的区别很大。并且不管实际显存被占用了多少,使用cudaMemGetInfo每次查询都是一个固定的显存占用值,这种情况和内存虚拟化很像,每个进程都有自己的虚拟空间。而在Linux服务器下使用cudaMemGetInfo查询时则为实际占用的显存大小。
原因:
windows系统下,当我们显卡插入显示器时显卡会处于WDDM模式。
在 WDDM 模式下,GPU 内存不由 CUDA 直接管理,也不由 GPU 驱动程序直接管理。GPU内存由Windows操作系统管理。微软提供的该软件将GPU内存视为虚拟资源,因此CUDA对实际内存使用情况一无所知,而只知道微软组件告诉它有关GPU内存的信息。如果我们想通过cudaMemGetInfo接口来获取实际的显存占用则需要切换为TCC模式。
两种模式区别
TCC:该模式下,GPU 完全用于计算,不能作为本地显示输出。
WDDM:该模式下,GPU 既用于计算又用于本地显示输出。
WDDM 模式简介
随着越来越多的硬件供应商发展到基于硬件的计划模型,其中的工作直接从用户模式提交到 GPU,而 GPU 管理各种工作队列本身,就有必要不必 VidMm 在提交到 GPU 引擎之前检查和修补每个命令缓冲区。
为实现此目的,WDDM v2 支持 GPU 虚拟寻址。 在此模型中,为每个进程分配一个唯一的 GPU 虚拟地址空间,其中每个要在其中执行的 GPU 上下文。 分配由进程创建或打开,在该进程的 GPU 虚拟地址空间中分配唯一的 GPU 虚拟地址,该地址空间在分配的生存期内保持不变并且唯一。 这允许用户模式驱动程序通过其 GPU 虚拟地址引用分配,而不必担心基础物理内存在其生存期内发生变化。
欢迎来到FlagOS开发社区,这里是一个汇聚了AI开发者、数据科学家、机器学习爱好者以及业界专家的活力平台。我们致力于成为业内领先的Triton技术交流与应用分享的殿堂,为推动人工智能技术的普及与深化应用贡献力量。
更多推荐



所有评论(0)