NvAPI_GPU_GetThermalSettings fails with NVAPI_NVIDIA_DEVICE_NOT_FOUND error

The following call to NvAPI_GPU_GetThermalSettings fails with a NVAPI_NVIDIA_DEVICE_NOT_FOUND error:

// load the NVAPI DLL
    NvAPI_Status rval = NvAPI_Initialize();
    if( rval != NVAPI_OK ){
        NvAPI_ShortString string;
        NvAPI_GetErrorMessage(rval, string);
        printf("NVAPI NvAPI_Initialize: %s\n", string);
    }

    NvAPI_ShortString ver;
    NvAPI_GetInterfaceVersionString( ver );
    if( rval != NVAPI_OK ){
        NvAPI_ShortString string;
        NvAPI_GetErrorMessage(rval, string);
        printf("NVAPI NvAPI_GetInterfaceVersionString: %s\n", string);
    }
    printf( "Version: %s\n", ver );

    NvPhysicalGpuHandle phys[NVAPI_MAX_PHYSICAL_GPUS];
    NvU32 cnt;
    rval = NvAPI_EnumTCCPhysicalGPUs(phys, &cnt);

    if (rval != NVAPI_OK){
        NvAPI_ShortString string;
        NvAPI_GetErrorMessage(rval, string);
        printf("NVAPI NvAPI_EnumTCCPhysicalGPUs: %s\n", string);
	}
    printf( "Found %d GPU handle(s)", cnt );
    for( NvU32 n=0; n<cnt; ++n ) printf( " 0x%016llx", phys[n] );
    printf( "\n");

    NvAPI_ShortString name;
    rval = NvAPI_GPU_GetFullName(*phys, name);
    if (rval != NVAPI_OK){
        NvAPI_ShortString string;
        NvAPI_GetErrorMessage(rval, string);
        printf("NVAPI NvAPI_GPU_GetFullName: %s\n", string);
    }
    printf("Name: %s\n", name);

    // this works
    NvU32 rpm = 0;
    rval = NvAPI_GPU_GetTachReading( *phys, &rpm );
    if( rval != NVAPI_OK ){
        NvAPI_ShortString string;
        NvAPI_GetErrorMessage(rval, string);
        printf("NVAPI NvAPI_GPU_GetTachReading: %s\n", string);
    }
    printf( "RPM: %u\n", rpm );

    // this fails
    NV_GPU_THERMAL_SETTINGS thermal = { 0 };
    thermal.version = NV_GPU_THERMAL_SETTINGS_VER;
    rval = NvAPI_GPU_GetThermalSettings(*phys,0, &thermal);
    if (rval != NVAPI_OK){
        NvAPI_ShortString string;
        NvAPI_GetErrorMessage(rval, string);
        printf("NVAPI NvAPI_GPU_GetThermalSettings: %s\n", string);
    }
    printf( "Temperature: %d\n", thermal.sensor[0].currentTemp );

    // unload the NVAPI dll
    rval = NvAPI_Unload();
    if( rval != NVAPI_OK ){
        NvAPI_ShortString string;
        NvAPI_GetErrorMessage(rval, string);
        printf("NVAPI NvAPI_Unload: %s\n", string);
    }

Output from the above:
Version: NVidia Complete Version 1.10
Found 3 GPU handle(s) 0x0000000000000d00 0x0000000000001100 0x0000000000000c00
Name: Tesla K20c
RPM: 1191
NVAPI NvAPI_GPU_GetThermalSettings: NVAPI_NVIDIA_DEVICE_NOT_FOUND
Temperature: 0

Details:

  • three NVidia K20c devices
  • Windows Server 2008 R2
  • Visual Studio 2013
  • CUDA 7.5
  • Graphics driver 353.90
  • NvAPI R352 (downloaded October 8, 2015)
  • same results with 32-bit and 64-bit builds

A workaround or fix would be great!