フィードメーター - 積読日記 track feed RSS スカウター : Mundania [ 合計 / 今日 / 昨日 ] [最新] [追記]

積読日記


Tue, 09 SapTimber 2008 [長年日記]

tDiary 1392日目

[programming] NVAPI で遊ぶ

NVIDIA の GPU や driver へ直にアクセスできる API が公開されている. 細かい所まで手を出せるので差別化になるのはわかるが, Microsoft が取りまとめている DirectX のような一般的な API で共通に扱えるほうが開発コストが低くて便利でもあるので, このあたりの API の選択は悩ましいところだろう. Video Control のような実用的な機能は NDA で制限されているので, public な部分だけで少し遊んでみた.
#include <cstdio>
#include "nvapi.h"
bool Succeeded(NvAPI_Status status)
{
	return NVAPI_OK == status;
}
void Log(const char* funcName, NvAPI_Status status)
{
	NvAPI_ShortString msg;
	NvAPI_GetErrorMessage(status, msg);
	fprintf(stderr, "Failed to %s: %s (0x%08X).\n", funcName, msg, status);
}
int main()
{
	NvAPI_Status status = NvAPI_Initialize();
	NvAPI_ShortString version;
	status = NvAPI_GetInterfaceVersionString(version);
	if (Succeeded(status)) {
		fprintf(stdout, "%s\n", version);
	}
	NvPhysicalGpuHandle physicalGpuHandles[NVAPI_MAX_PHYSICAL_GPUS];
	NvU32 numGpus = 0;
	status = NvAPI_EnumPhysicalGPUs(physicalGpuHandles, &numGpus);
	if (Succeeded(status)) {
		for (NvU32 i = 0; i < numGpus; ++ i) {
			NvPhysicalGpuHandle handle = physicalGpuHandles[i];
			NV_GPU_TYPE gpuType = NV_SYSTEM_TYPE_GPU_UNKNOWN;
			status = NvAPI_GPU_GetGPUType(handle, &gpuType);
			if (Succeeded(status)) {
				fprintf(stdout, "GPU type: %d\n", gpuType);
			}
			else {
				Log("NvAPI_GPU_GetGPUType", status);
			}
			NV_GPU_BUS_TYPE busType = NVAPI_GPU_BUS_TYPE_UNDEFINED;
			status = NvAPI_GPU_GetBusType(handle, &busType);
			if (Succeeded(status)) {
				fprintf(stdout, "BUS type: %d\n", busType);
			}
			else {
				Log("NvAPI_GPU_GetBusType", status);
			}
		}
	}
	return 0;
}
投稿日時 : 2008年09月10日 00:11