#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;
}
调用GPUShark读取显卡相关信息
最新推荐文章于 2024-09-27 17:31:02 发布
本文介绍了如何使用WindowsAPI在GPUShark应用中实现GPU状态的实时监控,包括获取GPU名称、温度、频率等信息。通过共享内存,程序可以与GPUShark进程交互并更新数据。
摘要由CSDN通过智能技术生成