调用GPUShark读取显卡相关信息

本文介绍了如何使用WindowsAPI在GPUShark应用中实现GPU状态的实时监控,包括获取GPU名称、温度、频率等信息。通过共享内存,程序可以与GPUShark进程交互并更新数据。
摘要由CSDN通过智能技术生成
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
#include <windows.h>
#include <stdint.h>


#define SHMEM_NAME _T("GPUShark_ShMem")
#define SHMEM_HEADER_SIGNATURE "[Geeks3D_GPUShark]"
#define SHMEM_HEADER_VERSION "[20170514]"


#pragma pack(push, 1)

// Structure for version 20170514.
struct shmem_GPU_t
{
	char name[128];
	char codename[128];
	uint32_t vendor_id;
	uint32_t device_id;
	float core_temperature;
	float core_clock;
	float mem_clock;
	float fan_speed_percent;
	float core_usage;
	float mem_usage;
	float power_percent;
	uint8_t padding[28]; // 320 bytes
};


SHELLEXECUTEINFO ShExecInfo;

#define GPUSHARK_SHMEM_MAX_GPUS 4

struct GPUSHARK_SHMEM
{
	char signature[32];
	char version[16];
	uint32_t num_gpus;
	shmem_GPU_t gpus[GPUSHARK_SHMEM_MAX_GPUS];
};
#pragma pack(pop)




GPUSHARK_SHMEM shmem;


bool shmem_is_running()
{
	bool ret = false;
	HANDLE hMapFile = OpenFileMapping(FILE_MAP_READ, FALSE, SHMEM_NAME);
	if (hMapFile)
	{
		ret = true;
		CloseHandle(hMapFile);
	}
	return ret;
}

uint32_t shmem_get_num_gpus()
{
	HANDLE hMapFile = OpenFileMapping(FILE_MAP_READ, FALSE, SHMEM_NAME);
	if (!hMapFile)
		return 0;

	GPUSHARK_SHMEM *p = (GPUSHARK_SHMEM*)MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0);
	if (!p)
	{
		CloseHandle(hMapFile);
		return false;
	}

	GPUSHARK_SHMEM shmem;
	memcpy(&shmem, p, sizeof(GPUSHARK_SHMEM));
	UnmapViewOfFile(p);
	CloseHandle(hMapFile);

	return shmem.num_gpus;
}


const char* shmem_get_gpu_name(size_t gpu_index)
{
	HANDLE hMapFile = OpenFileMapping(FILE_MAP_READ, FALSE, SHMEM_NAME);
	if (!hMapFile)
		return 0;

	GPUSHARK_SHMEM *p = (GPUSHARK_SHMEM*)MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0);
	if (!p)
	{
		CloseHandle(hMapFile);
		return false;
	}

	GPUSHARK_SHMEM shmem;
	memcpy(&shmem, p, sizeof(GPUSHARK_SHMEM));
	UnmapViewOfFile(p);
	CloseHandle(hMapFile);

	return shmem.gpus[gpu_index].name;
}

float shmem_get_gpu_temperature(size_t gpu_index)
{
	HANDLE hMapFile = OpenFileMapping(FILE_MAP_READ, FALSE, SHMEM_NAME);
	if (!hMapFile)
		return 0;

	GPUSHARK_SHMEM *p = (GPUSHARK_SHMEM*)MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0);
	if (!p)
	{
		CloseHandle(hMapFile);
		return false;
	}

	GPUSHARK_SHMEM shmem;
	memcpy(&shmem, p, sizeof(GPUSHARK_SHMEM));
	UnmapViewOfFile(p);
	CloseHandle(hMapFile);

	return shmem.gpus[gpu_index].core_temperature;
}

bool shmem_read_signature()
{
	HANDLE hMapFile = OpenFileMapping(FILE_MAP_READ, FALSE, SHMEM_NAME);
	if (!hMapFile)
		return false;

	GPUSHARK_SHMEM *p = (GPUSHARK_SHMEM*)MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0);
	if (!p)
	{
		CloseHandle(hMapFile);
		return false;
	}

	GPUSHARK_SHMEM shmem;
	memcpy(&shmem, p, sizeof(GPUSHARK_SHMEM));

	UnmapViewOfFile(p);
	CloseHandle(hMapFile);

	printf("\nConnected to shared memory block: %s", shmem.signature);
	return true;
}

bool OpenGPUSHARK()
{
	ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
	ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
	ShExecInfo.hwnd = NULL;
	ShExecInfo.lpVerb = NULL;
	ShExecInfo.lpFile = _T("D:\\gpushark.exe");
	ShExecInfo.lpParameters = _T("");
	ShExecInfo.lpDirectory = NULL;
	ShExecInfo.nShow = SW_SHOW;
	ShExecInfo.hInstApp = NULL;
	BOOL hNewExe = ShellExecuteEx(&ShExecInfo);
	//WaitForSingleObject(ShExecInfo.hProcess, INFINITE);
	if (!hNewExe)
	{
		printf("return value:%d\n", hNewExe);
		return 0;
	}
	else
	{
		printf("successed!\n");
		return 1;
	}
}


bool CloseGPUSHARK()
{
	if (ShExecInfo.hProcess != NULL)
	{
		TerminateProcess(ShExecInfo.hProcess, 0);
		ShExecInfo.hProcess = NULL;
	}
	return 1;
}

int _tmain(int argc, _TCHAR* argv[])
{
	OpenGPUSHARK();
	Sleep(2000);
	if (!shmem_read_signature())
	{
		printf("\nGPU Shark is not running.\n");
	}

	uint32_t ngpus = shmem_get_num_gpus();
	printf("\nNum GPUs: %d", ngpus);

	uint32_t counter = 0;
	//while (shmem_is_running())
	while (counter<1000)
	{
		uint32_t ngpus = shmem_get_num_gpus();

		for (uint32_t i = 0; i < ngpus; i++)
		{
			const char* name = shmem_get_gpu_name(i);
			float t = shmem_get_gpu_temperature(i);
			if (t)
				printf("\n%.6d - [%s] core temp: %.1f degC", counter, name, t);
			else
				printf("\n%.6d - [%s] - core temp: N.A.", counter, name);

		}
		counter++;
		Sleep(500);
	}

	printf("\nBye!");
	CloseGPUSHARK();
	system("pause");
	return 0;
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

誓天断发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值