NVAPI で使用中のVRAM量を取得する

以前も作っていた VRAM の使用量を量るソフトウェアがありましたが、今回は NVIDIA 限定で一番正確そうな取得方法を紹介します。

その方法は、 NVIDIA から公開されているライブラリである NVAPI を使用する方法です。この API セットの中に VRAM の情報を取得するものが含まれていました。取得するのも思いのほか簡単で、以下のように使用します。

// 初期化
NvAPI_Status nRet = NvAPI_Initialize();

NvU32 count = 0;
NvPhysicalGpuHandle hGpuHandles[NVAPI_MAX_PHYSICAL_GPUS] = { 0 };
NvAPI_EnumPhysicalGPUs( hGpuHandles, &count );

NvU32 physicalFBSize = 0;
NvPhysicalGpuHandle hGpuHandle = hGpuHandles[0];
NvAPI_GPU_GetPhysicalFrameBufferSize( hGpuHandle, &physicalFBSize );
bool isFinished = false;

do {
    char buf[128];
    NV_DISPLAY_DRIVER_MEMORY_INFO memoryInfo = { 0 };
    memoryInfo.version = NV_DISPLAY_DRIVER_MEMORY_INFO_VER;
    NvAPI_GPU_GetMemoryInfo( hGpuHandle, &memoryInfo );

    sprintf_s( buf, "VRAM Info\n  Using =%.1f (MB)\n  sharedSysMem = %.1f (MB)\n", 
        (memoryInfo.availableDedicatedVideoMemory-memoryInfo.curAvailableDedicatedVideoMemory)/1024.0,
        (memoryInfo.sharedSystemMemory/1024.0)
        );

    printf( buf );
    OutputDebugStringA( buf );
    Sleep(1000);

    if( GetAsyncKeyState( VK_ESCAPE ) & 0x8000 ) {
        isFinished = true;
    }
} while( !isFinished );

// 終了
NvAPI_Unload();

使用中のサイズについては、本プロセスのものではなくシステム全体での使用量なので、ウィンドウを新規に開いたりするだけでサイズが変動します。本手法はメーカーが公開している API を使用して取得なので一番確実な値として使えるかなと思います。なにより DirectX や OpenGL といった描画系 API に依存していない点もよさそうです。

プログラミング
すらりんをフォローする
すらりん日記

コメント

  1. JJ より:

    しょうもない質問でごめんなさい。 2x2のディスプレイでMosaicを使いたいのですが、画面をFlippedで使用できません。 そこでたどり着いたので NVAPIです。 NV_ROTATEというコマンドを使うらしいのですが、 NVAPI.h をどのPathに置いたらいいのでしょうか?

    ご教授お願いします

    • すらりん より:

      NVAPI.h ヘッダおよび関連ライブラリはお使いの環境に合わせて、自由に配置場所を決めていいと思いますよ。

      • JJ より:

        返信ありがとうございます。 Cでプログラミングするとのことも知りませんでした。 週末に サクッとCをみて、 minGW と visual studio code をそろえて
        Cのcompileを30個くらいしました。 なんとなくCの使い方がわかってきたところで、 NvidiaのNvapiのサンプルをダウンロードして、 それを読みながら、 compileしましたが、 Errorだらけ。 どうやらNvapi.h のincludeにある指定が MinGWでは 使えないらしく。 Visual Studio でしなくてはだめなのかと。

        まことに 申し訳ありませんが、 Nvapi64.lib と Nvapi.hはproperty.json のファイルに書き込みました。 どの Ccompilerが動作するかだけでも教えていただけないでしょうか?

        • すらりん より:

          自分は Visual Studio でやっていますね。 property.json とはなんでしょうか?

          • JJ より:

            ありがとう。 VSの2015をdownloadしました。propery.jsonは私の書き間違いです。コンパイルするときに必要なファイルをc_ccp_properties.jsonというファイルに”includePath”: [“c:\\nvapi.hがあるフォルダ”,”C:\\mingw\\bin”,
            と書くのかとどこかのSiteで見たもので、 私のような素人が手を出す領域ではないのをひしひし感じて、 でもやれるところまで進みます。

            自分では書けなくても、 せめてNVIDIAが提供してるアンプルだけはコンパイルしたい。 海外のSiteでは、 MinGWではコンパイルできないと書いてあったり、#include のオーダーを変えるとコンパイルできるとかいてあったり、

            今は毎日仕事から帰ってから、 学習してます。時々、申し訳ないですがお力添えお願いします。

タイトルとURLをコピーしました