如何刷新/垃圾收集 GPU 内存 - Windows 10 - Nvidia Geforce GTX 1050 Ti

如何刷新/垃圾收集 GPU 内存 - Windows 10 - Nvidia Geforce GTX 1050 Ti

我玩的一些应用程序/游戏存在 GPU 内存泄漏

使用的 GPU 内存随着时间的推移而增加

即使我关闭游戏/应用程序,GPU 使用的内存仍然存在

当我从设备管理器禁用 GPU 并启用 GPU 内存时,

但我想知道是否有任何软件/命令等可以刷新 GPU 内存?

我有 Geforce GTX 1050 Ti,并且正在使用 Windows 10

答案1

如果关闭应用程序后图形内存使用率仍然存在,则可能是图形驱动程序存在错误。常规 GPU 编程 API 对此无济于事。

Windows 提供了一种未记录的键盘快捷键来快速重启显卡驱动程序:

Win+ Ctrl+ Shift+B

在发布没有漏洞的更新驱动程序之前,这也许是一种足够的解决方法。重新启动图形驱动程序可能会导致弹性较差的应用程序崩溃。

答案2

您可能可以通过类似这样的 powershell 脚本来打开/关闭该功能。

  • 打开 Windows Powershell ISE 并将以下代码复制粘贴到其中

    {

    #禁用 GPU

    Get-PnpDevice -FriendlyName "GPU 名称" | Disable-PnpDevice

    #根据需要调整等待时间

    睡眠 - 秒 5

    #启用 GPU

    Get-PnpDevice -FriendlyName "GPU 名称" | Enable-PnpDevice

    }

  • 将“GPU 名称”替换为设备管理器中显示的 GPU 的确切名称。这是“友好名称”。但并非所有命令都适用于友好名称,因此您可能需要使用参数-Deviceid而不是,-FriendlyName并通过在设备管理器中右键单击 > GPU 上的属性来检索 Deviceid。

  • 将脚本保存到桌面并右键单击 > 使用 powershell 运行

这现在应该可以关闭/打开您的 GPU。有关清除 RAM 缓存的其他方法,您必须查看 NVIDIA 开发论坛。您可以使用 NVIDIA GPU 编写一些脚本。您应该可以在本地 C 盘上查看一些示例脚本:

C:\Program Files\NVIDIA Corporation\NVIDIA WMI 提供程序\Samples

答案3

如果您的浏览器占用了资源,通常有内部页面 URI 可以触发释放/刷新。例如,对于 Google Chrome,您可以在多功能框中输入:chrome://gpuclean并按回车键。

答案4

几个月来我遇到同样的问题,一直在寻找同样的答案。我认为 VRAM 的使用率即使在空闲时也在缓慢增加。

此外,重新启动后,卡会再次安装,并获取新的实例 ID。我确实回滚了驱动程序,但问题仍然存在。

我使用这个脚本来找到正确的实例ID并进行切换。

@echo off
setlocal enabledelayedexpansion
rem -params-
set select_field=Device Description
set select_value=3060
set instance_id=none
rem set "instance_id=PCI\VEN_10DE&DEV_2489&SUBSYS_88501043&REV_A1\4&1f822d9d&0&0008"
rem -params-end---change with care below this line

rem daca ID-ul e dat, se face chestia.
if /i "%instance_id%" neq "none" goto thething
rem altfel...
set value=none
for /f "tokens=1,2 delims=:" %%A in ('pnputil /enum-devices /class Display') do (
    rem elimina din %value%  textul cautat; 
    call set "test=%%value:%select_value%=%%"
    rem daca ramane la fel inseamna ca nu il are - deci ia urmatorul instance_id
    if /i "!value!" == "!test!" (
        set value=none
        if "%%A" == "Instance ID" set "tmp_id=%%B"
        if "%%A" == "%select_field%" for /f "tokens=* delims= " %%K in ("%%B") do set "value=%%K"
    ) else (
        set "instance_id=!tmp_id!"
        rem eliminat spatiu din fata (nu merge cu for ca are "&")
        set "instance_id=!instance_id:~16!"
    )
    rem daca e disconected seteaza value=none - ca sa treaca mai departe
    if "%%A" == "Status" (
        set "test=%%B"
        set test=!test:Disconnected=!
        if /i "!test!" neq "%%B" (
            set value=none
            set instance_id=none
        )
    )
)
echo selectie: %select_field% ~ %select_value% = %value%
echo rezultat instance ID: !instance_id!
rem daca nu s-a gasit
if /i "%instance_id%" == "none" (
    echo NUP... vezi mai jos:
    echo.
    pnputil /enum-devices /class Display
    echo.
    goto ending
)

rem verificare administrator
net session >nul 2>&1
if not %errorLevel% == 0 (
    echo.
    echo -- Trebuie deschis cu "Run as Administrator" -- 
    echo.
    goto ending
) 


:thething
pnputil /disable-device "%instance_id%"
timeout 2
pnputil /enable-device "%instance_id%"

:ending
echo.
pause

相关内容