검색결과 리스트
Programming에 해당되는 글 49건
- 2014.06.24 비디오 메모리 구하기
- 2014.06.22 [WinAPI] 컴퓨터 각종 부품 정보 알아내기 1
- 2014.06.22 GlobalMemoryStatusEx
- 2014.06.19 stack overrun
- 2014.06.14 operator new
- 2014.06.08 autoexp.dat
- 2014.06.08 Unity3D에서의 싱글톤 구현
- 2014.06.08 Singleton
- 2014.06.07 Unity3D에서 Visual Studio 2013 사용하기
글
비디오 메모리 구하기
Programming/C/C++
2014. 6. 24. 10:45
http://code.msdn.microsoft.com/windowsdesktop/DirectX-Video-Memory-ee7d8319
여기에 나온 방법으로 했어도 실시간으로 변화하는 GPU 메모리 사용량을 표시 할수는 없었다. 내가... 잘 못한건가?.. 어째든 실시간 비디오 메모리 사용량을 측정하기 위해 Nvidia를 떠돌며 삽질만 하다가 Nvapi.dll을 통하여 해결하였다.
// KGpuMon.h 源代码
#pragma once
#define MAX_GPU_NUM 4L // 监控的GPU个数(NVIDIA定义的最多GPU个数是64,这里最多只监控4个)
#define MY_PROCESS_ERROR(Condition) do { if (!(Condition)) goto Exit0; } while (false)
#define MAX_DISPLAY_CARDS 4 // 最多监控4块显卡(暂时应该够了吧)
// 常量定义
#define MAX_PHYSICAL_GPUS 64
#define SHORT_STRING_MAX 64
#define MAX_THERMAL_SENSORS_PER_GPU 3
#define MAX_CLOCKS_PER_GPU 0x120
#define MAX_PSTATES_PER_GPU 8
#define MAX_USAGES_PER_GPU 33
#define MAX_COOLER_PER_GPU 20
#define MAX_MEMORY_VALUES_PER_GPU 5
// 接口ID值
#define ID_NvAPI_Initialize 0x0150E828
#define ID_NvAPI_GPU_GetFullName 0xCEEE8E9F
#define ID_NvAPI_GPU_GetThermalSettings 0xE3640A56
#define ID_NvAPI_EnumNvidiaDisplayHandle 0x9ABDD40D
#define ID_NvAPI_GetPhysicalGPUsFromDisplay 0x34EF9506
#define ID_NvAPI_EnumPhysicalGPUs 0xE5AC921F
#define ID_NvAPI_GPU_GetTachReading 0x5F608315
#define ID_NvAPI_GPU_GetAllClocks 0x1BD69F49
#define ID_NvAPI_GPU_GetPStates 0x60DED2ED
#define ID_NvAPI_GPU_GetUsages 0x189A1FDF
#define ID_NvAPI_GPU_GetCoolerSettings 0xDA141340
#define ID_NvAPI_GPU_SetCoolerLevels 0x891FA0AE
#define ID_NvAPI_GPU_GetMemoryInfo 0x774AA982
#define ID_NvAPI_GetDisplayDriverVersion 0xF951A4D1
#define ID_NvAPI_GetInterfaceVersionString 0x01053FA5
#define ID_NvAPI_GPU_GetPCIIdentifiers 0x2DDFB66E
// 版本号参数定义
#define GPU_THERMAL_SETTINGS_VER (sizeof(NvGPUThermalSettings) | 0x10000)
#define GPU_CLOCKS_VER (sizeof(NvClocks) | 0x20000)
#define GPU_PSTATES_VER (sizeof(NvPStates) | 0x10000)
#define GPU_USAGES_VER (sizeof(NvUsages) | 0x10000)
#define GPU_COOLER_SETTINGS_VER (sizeof(NvGPUCoolerSettings) | 0x20000)
#define GPU_MEMORY_INFO_VER (sizeof(NvMemoryInfo) | 0x20000)
#define DISPLAY_DRIVER_VERSION_VER (sizeof(NvDisplayDriverVersion) | 0x10000)
#define GPU_COOLER_LEVELS_VER (sizeof(NvGPUCoolerLevels) | 0x10000)
enum NvStatus
{
enumNvStatus_OK = 0,
enumNvStatus_ERROR = -1,
enumNvStatus_LIBRARY_NOT_FOUND = -2,
enumNvStatus_NO_IMPLEMENTATION = -3,
enumNvStatus_API_NOT_INTIALIZED = -4,
enumNvStatus_INVALID_ARGUMENT = -5,
enumNvStatus_NVIDIA_DEVICE_NOT_FOUND = -6,
enumNvStatus_END_ENUMERATION = -7,
enumNvStatus_INVALID_HANDLE = -8,
enumNvStatus_INCOMPATIBLE_STRUCT_VERSION = -9,
enumNvStatus_HANDLE_INVALIDATED = -10,
enumNvStatus_OPENGL_CONTEXT_NOT_CURRENT = -11,
enumNvStatus_NO_GL_EXPERT = -12,
enumNvStatus_INSTRUMENTATION_DISABLED = -13,
enumNvStatus_EXPECTED_LOGICAL_GPU_HANDLE = -100,
enumNvStatus_EXPECTED_PHYSICAL_GPU_HANDLE = -101,
enumNvStatus_EXPECTED_DISPLAY_HANDLE = -102,
enumNvStatus_INVALID_COMBINATION = -103,
enumNvStatus_NOT_SUPPORTED = -104,
enumNvStatus_PORTID_NOT_FOUND = -105,
enumNvStatus_EXPECTED_UNATTACHED_DISPLAY_HANDLE = -106,
enumNvStatus_INVALID_PERF_LEVEL = -107,
enumNvStatus_DEVICE_BUSY = -108,
enumNvStatus_NV_PERSIST_FILE_NOT_FOUND = -109,
enumNvStatus_PERSIST_DATA_NOT_FOUND = -110,
enumNvStatus_EXPECTED_TV_DISPLAY = -111,
enumNvStatus_EXPECTED_TV_DISPLAY_ON_DCONNECTOR = -112,
enumNvStatus_NO_ACTIVE_SLI_TOPOLOGY = -113,
enumNvStatus_SLI_RENDERING_MODE_NOTALLOWED = -114,
enumNvStatus_EXPECTED_DIGITAL_FLAT_PANEL = -115,
enumNvStatus_ARGUMENT_EXCEED_MAX_SIZE = -116,
enumNvStatus_DEVICE_SWITCHING_NOT_ALLOWED = -117,
enumNvStatus_TESTING_CLOCKS_NOT_SUPPORTED = -118,
enumNvStatus_UNKNOWN_UNDERSCAN_CONFIG = -119,
enumNvStatus_TIMEOUT_RECONFIGURING_GPU_TOPO = -120,
enumNvStatus_DATA_NOT_FOUND = -121,
enumNvStatus_EXPECTED_ANALOG_DISPLAY = -122,
enumNvStatus_NO_VIDLINK = -123,
enumNvStatus_REQUIRES_REBOOT = -124,
enumNvStatus_INVALID_HYBRID_MODE = -125,
enumNvStatus_MIXED_TARGET_TYPES = -126,
enumNvStatus_SYSWOW64_NOT_SUPPORTED = -127,
enumNvStatus_IMPLICIT_SET_GPU_TOPOLOGY_CHANGE_NOT_ALLOWED = -128,
enumNvStatus_REQUEST_USER_TO_CLOSE_NON_MIGRATABLE_APPS = -129,
enumNvStatus_OUT_OF_MEMORY = -130,
enumNvStatus_WAS_STILL_DRAWING = -131,
enumNvStatus_FILE_NOT_FOUND = -132,
enumNvStatus_TOO_MANY_UNIQUE_STATE_OBJECTS = -133,
enumNvStatus_INVALID_CALL = -134,
enumNvStatus_D3D10_1_LIBRARY_NOT_FOUND = -135,
enumNvStatus_FUNCTION_NOT_FOUND = -136
};
enum NvThermalController
{
enumNvThermalController_NONE = 0,
enumNvThermalController_GPU_INTERNAL,
enumNvThermalController_ADM1032,
enumNvThermalController_MAX6649,
enumNvThermalController_MAX1617,
enumNvThermalController_LM99,
enumNvThermalController_LM89,
enumNvThermalController_LM64,
enumNvThermalController_ADT7473,
enumNvThermalController_SBMAX6649,
enumNvThermalController_VBIOSEVT,
enumNvThermalController_OS,
enumNvThermalController_UNKNOWN = -1,
};
enum NvThermalTarget
{
enumNvThermalTarget_NONE = 0,
enumNvThermalTarget_GPU = 1,
enumNvThermalTarget_MEMORY = 2,
enumNvThermalTarget_POWER_SUPPLY = 4,
enumNvThermalTarget_BOARD = 8,
enumNvThermalTarget_ALL = 15,
enumNvThermalTarget_UNKNOWN = -1
};
typedef struct _NvSensor
{
NvThermalController Controller;
unsigned int DefaultMinTemp;
unsigned int DefaultMaxTemp;
unsigned int CurrentTemp;
NvThermalTarget Target;
}NvSensor;
typedef struct _NvGPUThermalSettings
{
unsigned int Version;
unsigned int Count;
NvSensor Sensor[MAX_THERMAL_SENSORS_PER_GPU];
}NvGPUThermalSettings;
typedef struct _NvClocks
{
unsigned int Version;
unsigned int Clock[MAX_CLOCKS_PER_GPU];
}NvClocks;
typedef struct _NvPState
{
bool Present;
int Percentage;
}NvPState;
typedef struct _NvPStates
{
unsigned int Version;
unsigned int Flags;
NvPState PStates[MAX_PSTATES_PER_GPU];
}NvPStates;
typedef struct _NvUsages
{
unsigned int Version;
unsigned int Usages[MAX_USAGES_PER_GPU];
}NvUsages;
typedef struct _NvCooler
{
int Type;
int Controller;
int DefaultMin;
int DefaultMax;
int CurrentMin;
int CurrentMax;
int CurrentLevel;
int DefaultPolicy;
int CurrentPolicy;
int Target;
int ControlType;
int Active;
}NvCooler;
typedef struct _NvGPUCoolerSettings
{
unsigned int Version;
unsigned int Count;
NvCooler Coolers[MAX_COOLER_PER_GPU];
}NvGPUCoolerSettings;
typedef struct _NvLevel
{
int Level;
int Policy;
}NvLevel;
typedef struct _NvGPUCoolerLevels
{
unsigned int Version;
NvLevel Levels[MAX_COOLER_PER_GPU];
}NvGPUCoolerLevels;
typedef struct _NvMemoryInfo
{
unsigned int Version;
unsigned int Values[MAX_MEMORY_VALUES_PER_GPU];
}NvMemoryInfo;
typedef struct _NvDisplayDriverVersion
{
unsigned int Version;
unsigned int DriverVersion;
unsigned int BldChangeListNum;
char szBuildBranch[SHORT_STRING_MAX];
char szAdapter[SHORT_STRING_MAX];
}NvDisplayDriverVersion;
typedef int NvPhysicalGpuHandle;
typedef int NvDisplayHandle;
// 函数定义
typedef void* (*nvapi_QueryInterfaceType)(unsigned int uiInterfaceID);
typedef NvStatus (*NvAPI_InitializeType)();
typedef NvStatus (*NvAPI_GPU_GetFullNameType)(const NvPhysicalGpuHandle gpuHandle, char *pszName);
typedef NvStatus (*NvAPI_GPU_GetThermalSettingsType)(const NvPhysicalGpuHandle gpuHandle, int sensorIndex, NvGPUThermalSettings *pnvGPUThermalSettings);
typedef NvStatus (*NvAPI_EnumNvidiaDisplayHandleType)(const int thisEnum, NvDisplayHandle *pDisplayHandle);
typedef NvStatus (*NvAPI_GetPhysicalGPUsFromDisplayType)(const NvDisplayHandle displayHandle, NvPhysicalGpuHandle *pGpuHandles, unsigned int *pGpuCount);
typedef NvStatus (*NvAPI_EnumPhysicalGPUsType)(NvPhysicalGpuHandle *pGpuHandles, int *pGpuCount);
typedef NvStatus (*NvAPI_GPU_GetTachReadingType)(const NvPhysicalGpuHandle gpuHandle, int *pnValue);
typedef NvStatus (*NvAPI_GPU_GetAllClocksType)(const NvPhysicalGpuHandle gpuHandle, NvClocks *pnvClocks);
typedef NvStatus (*NvAPI_GPU_GetPStatesType)(const NvPhysicalGpuHandle gpuHandle, NvPStates *pnvPStates);
typedef NvStatus (*NvAPI_GPU_GetUsagesType)(const NvPhysicalGpuHandle gpuHandle, NvUsages *pnvUsages);
typedef NvStatus (*NvAPI_GPU_GetCoolerSettingsType)(const NvPhysicalGpuHandle gpuHandle, int coolerIndex, NvGPUCoolerSettings *pnvGPUCoolerSettings);
typedef NvStatus (*NvAPI_GPU_SetCoolerLevelsType)(const NvPhysicalGpuHandle gpuHandle, int coolerIndex, NvGPUCoolerLevels *pnvGPUCoolerLevels);
typedef NvStatus (*NvAPI_GPU_GetMemoryInfoType)(const NvDisplayHandle displayHandle, NvMemoryInfo *pnvMemoryInfo);
typedef NvStatus (*NvAPI_GetDisplayDriverVersionType)(const NvDisplayHandle displayHandle, NvDisplayDriverVersion *pnvDisplayDriverVersion);
typedef NvStatus (*NvAPI_GetInterfaceVersionStringType)(char *pszVersion);
typedef NvStatus (*NvAPI_GPU_GetPCIIdentifiersType)(
const NvPhysicalGpuHandle gpuHandle,
unsigned int *puiDeviceId,
unsigned int *puiSubSystemId,
unsigned int *puiRevisionId,
unsigned int *puiExtDeviceId
);
//*****************************以下是类内部使用的结构体************************************//
/*
* @brief GPU信息
*/
typedef struct _GPU_INFO
{
NvPhysicalGpuHandle nvGpuHandle; // GPU句柄
int nUsage; // GPU占用率
}GPU_INFO;
/*
* @brief 显卡信息
*/
typedef struct _DISPLAY_CARD_INFO
{
NvDisplayHandle nvDisplayHandle; // 显卡句柄
int nGpuCount; // Gpu个数
DWORD dwTotalMemory; // 总显存大小(KB)
DWORD dwFreeMemory; // 空闲显存大小(KB)
GPU_INFO sGpuInfo[MAX_GPU_NUM]; // GPU信息
}DISPLAY_CARD_INFO;
//*****************************************************************************************//
/*
* @brief 显卡相关信息(可用于导出的结构体)
*/
typedef struct _DISPLAY_INFO
{
int nGpuCount; // Gpu个数
int nGpuUsages[MAX_GPU_NUM]; // Gpu占用率
DWORD dwTotalMemory; // 总显存大小(KB)
DWORD dwFreeMemory; // 空闲显存大小(KB)
}DISPLAY_INFO;
class KGpuMon
{
public:
KGpuMon(void);
~KGpuMon(void);
BOOL Init();
BOOL Unit();
int GetDisplayCardCount();
BOOL GetDisplayInfo(const int nCardIndex, DISPLAY_INFO *pDisplayInfo);
private:
int EnumDisplayCards();
BOOL GetGpuHandles(const NvDisplayHandle nvDisplayHandle, DISPLAY_CARD_INFO *pCardInfo);
BOOL GetDisplayCardGpuUsages(const NvDisplayHandle nvDisplayHandle, DISPLAY_CARD_INFO *pCardInfo);
BOOL GetDisplayCardMemoryInfo(const NvDisplayHandle nvDisplayHandle, DISPLAY_CARD_INFO *pCardInfo);
private:
nvapi_QueryInterfaceType m_pfnNvapi_QueryInterface;
NvAPI_InitializeType m_pfnNvAPI_Initialize;
NvAPI_GPU_GetFullNameType m_pfnNvAPI_GPU_GetFullName;
NvAPI_GPU_GetThermalSettingsType m_pfnNvAPI_GPU_GetThermalSettings;
NvAPI_EnumNvidiaDisplayHandleType m_pfnNvAPI_EnumNvidiaDisplayHandle;
NvAPI_GetPhysicalGPUsFromDisplayType m_pfnNvAPI_GetPhysicalGPUsFromDisplay;
NvAPI_EnumPhysicalGPUsType m_pfnNvAPI_EnumPhysicalGPUs;
NvAPI_GPU_GetTachReadingType m_pfnNvAPI_GPU_GetTachReading;
NvAPI_GPU_GetAllClocksType m_pfnNvAPI_GPU_GetAllClocks;
NvAPI_GPU_GetPStatesType m_pfnNvAPI_GPU_GetPStates;
NvAPI_GPU_GetUsagesType m_pfnNvAPI_GPU_GetUsages;
NvAPI_GPU_GetCoolerSettingsType m_pfnNvAPI_GPU_GetCoolerSettings;
NvAPI_GPU_SetCoolerLevelsType m_pfnNvAPI_GPU_SetCoolerLevels;
NvAPI_GPU_GetMemoryInfoType m_pfnNvAPI_GPU_GetMemoryInfo;
NvAPI_GetDisplayDriverVersionType m_pfnNvAPI_GetDisplayDriverVersion;
NvAPI_GetInterfaceVersionStringType m_pfnNvAPI_GetInterfaceVersionString;
NvAPI_GPU_GetPCIIdentifiersType m_pfnNvAPI_GPU_GetPCIIdentifiers;
int m_nDisplayCardCount;
DISPLAY_CARD_INFO* m_pDisplayCards;
HMODULE m_hNvApiDll;
};
//**************************************************************************************************/
// KGpuMon.cpp 源代码
#include "StdAfx.h"
#include "KGpuMon.h"
KGpuMon::KGpuMon(void)
{
m_hNvApiDll = NULL;
m_nDisplayCardCount = 0;
m_pDisplayCards = NULL;
}
KGpuMon::~KGpuMon(void)
{
Unit();
}
BOOL KGpuMon::Init()
{
BOOL bResult = FALSE;
BOOL bRetCode = FALSE;
int nIndex = 0;
int nResult = 0;
m_hNvApiDll = LoadLibrary(_T("nvapi.dll"));
if (m_hNvApiDll)
{
m_pfnNvapi_QueryInterface = (nvapi_QueryInterfaceType)GetProcAddress(m_hNvApiDll, "nvapi_QueryInterface");
if (m_pfnNvapi_QueryInterface)
{
m_pfnNvAPI_Initialize = (NvAPI_InitializeType)m_pfnNvapi_QueryInterface(ID_NvAPI_Initialize);
m_pfnNvAPI_GPU_GetFullName = (NvAPI_GPU_GetFullNameType)m_pfnNvapi_QueryInterface(ID_NvAPI_GPU_GetFullName);
m_pfnNvAPI_GPU_GetThermalSettings = (NvAPI_GPU_GetThermalSettingsType)m_pfnNvapi_QueryInterface(ID_NvAPI_GPU_GetThermalSettings);
m_pfnNvAPI_EnumNvidiaDisplayHandle = (NvAPI_EnumNvidiaDisplayHandleType)m_pfnNvapi_QueryInterface(ID_NvAPI_EnumNvidiaDisplayHandle);
m_pfnNvAPI_GetPhysicalGPUsFromDisplay = (NvAPI_GetPhysicalGPUsFromDisplayType)m_pfnNvapi_QueryInterface(ID_NvAPI_GetPhysicalGPUsFromDisplay);
m_pfnNvAPI_EnumPhysicalGPUs = (NvAPI_EnumPhysicalGPUsType)m_pfnNvapi_QueryInterface(ID_NvAPI_EnumPhysicalGPUs);
m_pfnNvAPI_GPU_GetTachReading = (NvAPI_GPU_GetTachReadingType)m_pfnNvapi_QueryInterface(ID_NvAPI_GPU_GetTachReading);
m_pfnNvAPI_GPU_GetAllClocks = (NvAPI_GPU_GetAllClocksType)m_pfnNvapi_QueryInterface(ID_NvAPI_GPU_GetAllClocks);
m_pfnNvAPI_GPU_GetPStates = (NvAPI_GPU_GetPStatesType)m_pfnNvapi_QueryInterface(ID_NvAPI_GPU_GetPStates);
m_pfnNvAPI_GPU_GetUsages = (NvAPI_GPU_GetUsagesType)m_pfnNvapi_QueryInterface(ID_NvAPI_GPU_GetUsages);
m_pfnNvAPI_GPU_GetCoolerSettings = (NvAPI_GPU_GetCoolerSettingsType)m_pfnNvapi_QueryInterface(ID_NvAPI_GPU_GetCoolerSettings);
m_pfnNvAPI_GPU_SetCoolerLevels = (NvAPI_GPU_SetCoolerLevelsType)m_pfnNvapi_QueryInterface(ID_NvAPI_GPU_SetCoolerLevels);
m_pfnNvAPI_GPU_GetMemoryInfo = (NvAPI_GPU_GetMemoryInfoType)m_pfnNvapi_QueryInterface(ID_NvAPI_GPU_GetMemoryInfo);
m_pfnNvAPI_GetDisplayDriverVersion = (NvAPI_GetDisplayDriverVersionType)m_pfnNvapi_QueryInterface(ID_NvAPI_GetDisplayDriverVersion);
m_pfnNvAPI_GetInterfaceVersionString = (NvAPI_GetInterfaceVersionStringType)m_pfnNvapi_QueryInterface(ID_NvAPI_GetInterfaceVersionString);
m_pfnNvAPI_GPU_GetPCIIdentifiers = (NvAPI_GPU_GetPCIIdentifiersType)m_pfnNvapi_QueryInterface(ID_NvAPI_GPU_GetPCIIdentifiers);
if (m_pfnNvAPI_Initialize)
{
nResult = m_pfnNvAPI_Initialize();
if (enumNvStatus_OK == nResult)
{
m_pDisplayCards = new DISPLAY_CARD_INFO[MAX_DISPLAY_CARDS];
ZeroMemory(m_pDisplayCards, MAX_DISPLAY_CARDS * sizeof(DISPLAY_CARD_INFO));
// 获取显卡个数
nResult = EnumDisplayCards();
MY_PROCESS_ERROR(nResult > 0);
// 获取每块显卡的GPU个数
for (nIndex = 0; nIndex < m_nDisplayCardCount; ++nIndex)
{
bRetCode = GetGpuHandles(m_pDisplayCards[nIndex].nvDisplayHandle, &m_pDisplayCards[nIndex]);
MY_PROCESS_ERROR(bRetCode);
}
bResult = TRUE;
}
}
}
}
Exit0:
return bResult;
}
BOOL KGpuMon::Unit()
{
m_nDisplayCardCount = 0;
if (m_pDisplayCards)
{
delete []m_pDisplayCards;
m_pDisplayCards = NULL;
}
if (m_hNvApiDll)
{
FreeLibrary(m_hNvApiDll);
m_hNvApiDll = NULL;
}
return TRUE;
}
BOOL KGpuMon::GetDisplayInfo(const int nCardIndex, DISPLAY_INFO *pDisplayInfo)
{
BOOL bResult = FALSE;
int nIndex = 0;
if (nCardIndex < m_nDisplayCardCount)
{
bResult = GetDisplayCardGpuUsages(m_pDisplayCards[nCardIndex].nvDisplayHandle, &m_pDisplayCards[nCardIndex]);
MY_PROCESS_ERROR(bResult);
pDisplayInfo->nGpuCount = m_pDisplayCards[nCardIndex].nGpuCount;
for (nIndex = 0; nIndex < pDisplayInfo->nGpuCount; ++nIndex)
{
pDisplayInfo->nGpuUsages[nIndex] = m_pDisplayCards[nCardIndex].sGpuInfo[nIndex].nUsage;
}
bResult = GetDisplayCardMemoryInfo(m_pDisplayCards[nCardIndex].nvDisplayHandle, &m_pDisplayCards[nCardIndex]);
MY_PROCESS_ERROR(bResult);
pDisplayInfo->dwTotalMemory = m_pDisplayCards[nCardIndex].dwTotalMemory;
pDisplayInfo->dwFreeMemory = m_pDisplayCards[nCardIndex].dwFreeMemory;
}
Exit0:
return bResult;
}
int KGpuMon::GetDisplayCardCount()
{
return m_nDisplayCardCount;
}
int KGpuMon::EnumDisplayCards()
{
NvStatus nvResult;
NvDisplayHandle nvDisplayCardHandle;
int nIndex = 0;
m_nDisplayCardCount = 0;
if (m_pfnNvAPI_EnumNvidiaDisplayHandle)
{
for (nIndex = 0; nIndex < MAX_DISPLAY_CARDS; ++nIndex)
{
nvResult = m_pfnNvAPI_EnumNvidiaDisplayHandle(nIndex, &nvDisplayCardHandle);
if (enumNvStatus_OK == nvResult)
{
m_pDisplayCards[m_nDisplayCardCount].nvDisplayHandle = nvDisplayCardHandle;
++m_nDisplayCardCount;
}
}
}
return m_nDisplayCardCount;
}
BOOL KGpuMon::GetGpuHandles(const NvDisplayHandle nvDisplayHandle, DISPLAY_CARD_INFO *pCardInfo)
{
BOOL bResult = FALSE;
NvStatus nvStatus;
NvPhysicalGpuHandle *pnvHandles = NULL;
int nIndex = 0;
unsigned int uiGpuCount = 0;
if (m_pfnNvAPI_GetPhysicalGPUsFromDisplay)
{
pnvHandles = new NvPhysicalGpuHandle[MAX_PHYSICAL_GPUS];
nvStatus = m_pfnNvAPI_GetPhysicalGPUsFromDisplay(nvDisplayHandle, pnvHandles, &uiGpuCount);
if (enumNvStatus_OK == nvStatus)
{
pCardInfo->nGpuCount = min(uiGpuCount, MAX_GPU_NUM);
for (nIndex = 0; nIndex < pCardInfo->nGpuCount; ++nIndex)
{
pCardInfo->sGpuInfo[nIndex].nvGpuHandle = pnvHandles[nIndex];
}
bResult = TRUE;
}
delete []pnvHandles;
pnvHandles = NULL;
}
return bResult;
}
BOOL KGpuMon::GetDisplayCardGpuUsages(const NvDisplayHandle nvDisplayHandle, DISPLAY_CARD_INFO *pCardInfo)
{
BOOL bResult = FALSE;
int nIndex = 0;
NvStatus nvStatus = enumNvStatus_ERROR;
NvUsages *pnvUsages = NULL;
if (m_pfnNvAPI_GPU_GetUsages)
{
pnvUsages = new NvUsages;
pnvUsages->Version = GPU_USAGES_VER;
for (nIndex = 0; nIndex < pCardInfo->nGpuCount; ++nIndex)
{
nvStatus = m_pfnNvAPI_GPU_GetUsages(pCardInfo->sGpuInfo[nIndex].nvGpuHandle, pnvUsages);
if (enumNvStatus_OK == nvStatus)
{
pCardInfo->sGpuInfo[nIndex].nUsage = pnvUsages->Usages[2];
}
}
delete pnvUsages;
pnvUsages = NULL;
bResult = (enumNvStatus_OK == nvStatus) ? TRUE : FALSE;
}
return bResult;
}
BOOL KGpuMon::GetDisplayCardMemoryInfo(const NvDisplayHandle nvDisplayHandle, DISPLAY_CARD_INFO *pCardInfo)
{
BOOL bResult = FALSE;
int nIndex = 0;
NvStatus nvStatus = enumNvStatus_ERROR;
NvUsages *pnvUsages = NULL;
NvMemoryInfo sMemoryInfo;
if (m_pfnNvAPI_GPU_GetMemoryInfo)
{
sMemoryInfo.Version = GPU_MEMORY_INFO_VER;
nvStatus = m_pfnNvAPI_GPU_GetMemoryInfo(nvDisplayHandle, &sMemoryInfo);
if (enumNvStatus_OK == nvStatus)
{
pCardInfo->dwTotalMemory = (DWORD)(sMemoryInfo.Values[0]);
pCardInfo->dwFreeMemory = (DWORD)(sMemoryInfo.Values[4]);
bResult = TRUE;
}
}
return bResult;
}
http://blog.csdn.net/paopaoc/article/details/9093125'Programming > C/C++' 카테고리의 다른 글
| CPUInfo (0) | 2014.07.22 |
|---|---|
| Memory Bandwidth (0) | 2014.06.30 |
| [WinAPI] 컴퓨터 각종 부품 정보 알아내기 (1) | 2014.06.22 |
| GlobalMemoryStatusEx (0) | 2014.06.22 |
| stack overrun (0) | 2014.06.19 |
설정
트랙백
댓글
글
[WinAPI] 컴퓨터 각종 부품 정보 알아내기
Programming/C/C++
2014. 6. 22. 13:18
// 컴퓨터 각종 부품 정보 알아내기
std::wstring GetProcessorName()
{
wchar_t Cpu_info[100];
HKEY hKey;
int i = 0;
long result = 0;
DWORD c_size = sizeof(Cpu_info);
//레지스트리를 조사하여 프로세서의 모델명을 얻어냅니다.
RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Hardware\\Description\\System\\CentralProcessor\\0", 0, KEY_QUERY_VALUE, &hKey);
RegQueryValueEx(hKey, L"ProcessorNameString", NULL, NULL, (LPBYTE)Cpu_info, &c_size);
RegCloseKey(hKey);
//GetSystemInfo 함수를 이용해 논리적 코어 개수를 얻어냅니다.
wchar_t num[8];
SYSTEM_INFO systemInfo;
GetSystemInfo(&systemInfo);
swprintf(num, 8, L" * %d", systemInfo.dwNumberOfProcessors);
wcscat_s(Cpu_info, 100, num);
return Cpu_info;
}
std::wstring GetOSName()
{
wchar_t ProductName[100];
wchar_t CSDVersion[100];
std::wstring Os_info;
HKEY hKey;
int i = 0;
DWORD c_size = 100;
//레지스트리를 조사하여 운영체제 이름을 조사합니다.
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\", 0, KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS)
{
return L"Fail to Open OS_info";
}
if(RegQueryValueEx(hKey, L"ProductName", NULL, NULL, (LPBYTE)ProductName, &c_size) != ERROR_SUCCESS)
{
return L"Fail to Load the ProductName";
}
if(RegQueryValueEx(hKey, L"CSDVersion", NULL, NULL, (LPBYTE)CSDVersion, &c_size) != ERROR_SUCCESS)
{
RegCloseKey(hKey);
return ProductName;
}
Os_info = ProductName;
Os_info += L" ";
Os_info += CSDVersion;
RegCloseKey(hKey);
return Os_info;
}
std::string GetMemoryInfo()
{
//GlobalMemoryStatusEX 함수를 이용해 물리적 메모리양을 조사합니다.
MEMORYSTATUSEX ms;
ms.dwLength = sizeof(MEMORYSTATUSEX);
GlobalMemoryStatusEx(&ms);
char mss[128];
sprintf_s(mss, 128, "%d MB", ms.ullTotalPhys / 1024 / 1024);
return mss;
}
std::string GetGPUInfo(LPDIRECT3D9 d3d)
{
//IDirect3D9 인터페이스를 이용해 GPU모델명을 얻어냅니다.
D3DADAPTER_IDENTIFIER9 id;
d3d->GetAdapterIdentifier(D3DADAPTER_DEFAULT, 0, &id);
return id.Description;
}
http://bab2min.tistory.com/358'Programming > C/C++' 카테고리의 다른 글
| Memory Bandwidth (0) | 2014.06.30 |
|---|---|
| 비디오 메모리 구하기 (0) | 2014.06.24 |
| GlobalMemoryStatusEx (0) | 2014.06.22 |
| stack overrun (0) | 2014.06.19 |
| operator new (0) | 2014.06.14 |
설정
트랙백
댓글
글
GlobalMemoryStatusEx
Programming/C/C++
2014. 6. 22. 12:43
// Use to convert bytes to KB
#define DIV 1024
// Specify the width of the field in which to print the numbers.
// The asterisk in the format specifier "%*I64d" takes an integer
// argument and uses it to pad and right justify the number.
#define WIDTH 7
void _tmain()
{
MEMORYSTATUSEX statex;
statex.dwLength = sizeof (statex);
GlobalMemoryStatusEx (&statex);
_tprintf (TEXT("There is %*ld percent of memory in use.\n"),
WIDTH, statex.dwMemoryLoad);
_tprintf (TEXT("There are %*I64d total KB of physical memory.\n"),
WIDTH, statex.ullTotalPhys/DIV);
_tprintf (TEXT("There are %*I64d free KB of physical memory.\n"),
WIDTH, statex.ullAvailPhys/DIV);
_tprintf (TEXT("There are %*I64d total KB of paging file.\n"),
WIDTH, statex.ullTotalPageFile/DIV);
_tprintf (TEXT("There are %*I64d free KB of paging file.\n"),
WIDTH, statex.ullAvailPageFile/DIV);
_tprintf (TEXT("There are %*I64d total KB of virtual memory.\n"),
WIDTH, statex.ullTotalVirtual/DIV);
_tprintf (TEXT("There are %*I64d free KB of virtual memory.\n"),
WIDTH, statex.ullAvailVirtual/DIV);
// Show the amount of extended memory available.
_tprintf (TEXT("There are %*I64d free KB of extended memory.\n"),
WIDTH, statex.ullAvailExtendedVirtual/DIV);
}
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366589(v=vs.85).aspx'Programming > C/C++' 카테고리의 다른 글
| Memory Bandwidth (0) | 2014.06.30 |
|---|---|
| 비디오 메모리 구하기 (0) | 2014.06.24 |
| [WinAPI] 컴퓨터 각종 부품 정보 알아내기 (1) | 2014.06.22 |
| stack overrun (0) | 2014.06.19 |
| operator new (0) | 2014.06.14 |
설정
트랙백
댓글
글
stack overrun
Programming/C/C++
2014. 6. 19. 16:42
http://www.microsoft.com/korea/msdn/columns/contents/CodeSecure/secure05202002/default.aspx
메모리를 검색합니다.
어떻게 szName 과 cbName이 유효하다는 것을 알게 되었습니까? 사용자가 올바른 값을 제공한다고 믿으십니까? 일반적으로 대답은 아니요입니다. 버퍼 크기가 올바른지 확인할 수 있는 간단한 방법은 메모리를 검색하는 것입니다. 다음 코드 조각은 코드의 디버그 버전에서 이를 수행할 수 있는 방법을 보여줍니다.
void Function(char *szName, DWORD cbName) {
char szBuff[MAX_NAME];
#ifdef _DEBUG
// 검색
memset(szBuff, 0x42, cbName);
#endif
// szName 복사 및 사용
if (cbName < MAX_NAME)
strncpy(szBuff,szName,MAX_NAME-1);
}
이 코드에서는 대상 버퍼에 0x42 값을 씁니다. 버퍼를 복사하는 대신 이렇게 하는 이유가 의아할 것입니다. 대상 버퍼 끝에 알려진 고정된 값을 쓰면 소스 버퍼가 너무 클 경우 코드가 실패할 수 있습니다. 개발 프로세스 초기에 개발 버그를 찾을 수도 있습니다. 공격자의 악의적인 부분을 실행하는 대신 실패로 끝나는 것이 더 낫습니다. 이 때문에 공격자의 버퍼를 복사하지 않으려는 것입니다.
참고 테스트 중에 버퍼 오버런을 가져오는 것을 도와주기 위해 디버그 빌드에서만 이를 수행해야 합니다.
'Programming > C/C++' 카테고리의 다른 글
| Memory Bandwidth (0) | 2014.06.30 |
|---|---|
| 비디오 메모리 구하기 (0) | 2014.06.24 |
| [WinAPI] 컴퓨터 각종 부품 정보 알아내기 (1) | 2014.06.22 |
| GlobalMemoryStatusEx (0) | 2014.06.22 |
| operator new (0) | 2014.06.14 |
설정
트랙백
댓글
글
operator new
Programming/C/C++
2014. 6. 14. 15:56
'Programming > C/C++' 카테고리의 다른 글
| Memory Bandwidth (0) | 2014.06.30 |
|---|---|
| 비디오 메모리 구하기 (0) | 2014.06.24 |
| [WinAPI] 컴퓨터 각종 부품 정보 알아내기 (1) | 2014.06.22 |
| GlobalMemoryStatusEx (0) | 2014.06.22 |
| stack overrun (0) | 2014.06.19 |
설정
트랙백
댓글
글
autoexp.dat
Programming/VisualStudio
2014. 6. 8. 19:15
http://msdn.microsoft.com/ko-kr/library/zf0e8s14.aspx
atl이나 atlport를 디버깅 할 때 해당 컨테이너의 값을 보기가 힘든데
autoexp.data 를 수정하면 보기 편하게 바꿀수 있다.
'Programming > VisualStudio' 카테고리의 다른 글
| 네이티브 환경에서 사용자 정의 그래픽 시각화 만들기 (0) | 2014.10.23 |
|---|---|
| VTune 세팅법 (0) | 2014.10.15 |
| Mini dump (0) | 2014.08.21 |
| 리소스 편집 (0) | 2014.07.18 |
| The Windows Heap Is Slow When Launched from the Debugger (0) | 2014.07.16 |
설정
트랙백
댓글
글
Unity3D에서의 싱글톤 구현
Programming/Unity3D
2014. 6. 8. 18:11
//컴포넌트 기반 싱글톤
//-------------------------------------------------------------------------------------------
using UnityEngine;
public class MySingleton : MonoBehaviour
{
private static MySingleton instance;
public static MySingleton Instance
{
get
{
if ( instance == null )
instance = new GameObject("MySingleton").AddComponent( );
return instance;
}
}
public void OnApplicationQuit( )
{
instance = null;
}
}
//-------------------------------------------------------------------------------------------
//사용 예)
public class MySingleton
{
private static MySingleton instance; // 인스턴스
public MySingleton( )
{
if ( instance != null )
{
Debug.LogError( "Can't have two instances of singleton !!" );
return;
}
instance = this;
}
public static MySingleton Instance
{
get
{
if ( instance == null )
new MySingleton( ); //첫 인스턴스 생성
return instance;
}
}
private int score; // 내부 데이터 변수
public int Score
{
get {
return scroe;
} set {
score = value;
}
}
}
//-------------------------------------------------------------------------------------------
MySingleton.Instance.Score += 9;
Debug.Log( "Score is now: " + MySingleton.Instance.Score );
//템플릿 기반 싱글톤
//-------------------------------------------------------------------------------------------
using UnityEngine;
public abstract class MonoSingleton< T > : MonoBehaviour where T : MonoSingleton< T >
{
private static T m_Instance = null;
public static T instance
{
get
{
if ( m_Instance == null )
{
m_Instance = GameObject.FindObjectOfType( typeof(T) ) as T;
if ( m_Instance == null)
Debug.LogError( "No instance of " + typeof(T).ToString( ) );
m_Instance.Init( );
}
return m_Instance;
}
}
private void Awake( )
{
if ( m_Instance == null )
{
m_Instance = this as T;
m_Instance.Init( );
}
}
public virtual void Init( ) { } // 초기화를 상속을 통해 구현
private void OnApplicationQuit( )
{
m_Instance = null;
}
}
//-------------------------------------------------------------------------------------------
//사용 예)
GameManager.cs
public class GameManager : MonoSingleton< GameManager >
{
public int difficulty = 0;
public override void Init( ) { difficulty = 5; }
}
//-------------------------------------------------------------------------------------------
OtherClass.cs
using UnityEngine;
public class OtherClass : MonoBehaviour
{
void Start( )
{
print( GameManager.instance.difficulty );
}
}
출처 : http://blog.naver.com/rapha0/110154460575'Programming > Unity3D' 카테고리의 다른 글
| Unity3D에서 Visual Studio 2013 사용하기 (0) | 2014.06.07 |
|---|
설정
트랙백
댓글
글
Singleton
Programming/C#
2014. 6. 8. 17:19
using System;
public sealed class Singleton
{
private static volatile Singleton instance;
private static object syncRoot = new Object();
private Singleton() {}
public static Singleton Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}
}
http://msdn.microsoft.com/en-us/library/ff650316.aspx설정
트랙백
댓글
글
Unity3D에서 Visual Studio 2013 사용하기
Programming/Unity3D
2014. 6. 7. 13:42
- In Unity Editor go to Edit->Preferences->External Tools and In External Script Editor choose Browse from the drop down box.
- Browse to and select C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\devenv.exe.
- The External Script Editor should automatically show your selected editor as Visual Studio 2013.
- That’s it! It should just work from that point on.
- Edit->Preferences->External Tools
- 플러그인 설치 http://unityvs.com/
- "UnityVS_1.8.1-2013"
- - Copy SyntaxTree.VisualStudio.Packages.dll to:
- C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\Extensions\SyntaxTree\UnityVS
'Programming > Unity3D' 카테고리의 다른 글
| Unity3D에서의 싱글톤 구현 (0) | 2014.06.08 |
|---|
autoexp.dat