검색결과 리스트
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출처 : http://blog.naver.com/rapha0/110154460575( ); 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 ); } }
'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 |
---|