- 멀티 코어 CPU에서 코어 별 사용량 측정하는 법 (VS2008)
- 컴퓨터야그/자작
- 2010. 6. 25. 19:31
Visual C++에서 CPU의 사용량을 확인할 때는 PDH(Performance Data Helper)를 이용하는 것이 기본이다.
그런데, 그 방법으로는 멀티코어 CPU에서의 코어 별 사용량을 알 수가 없다.
해결책을 뒤진 결과 Code Project: Getting CPU Usage in a Multiprocessor Machine라는 글을 찾을 수 있었다.
(이 글에 따르면) WMI(Windows Management and Instrumentation)를 이용해야 하며, Win32_PerfRawData_PerfOS_Processor 클래스를 사용하면 원하는 결과를 얻을 수 있다.
위의 글을 보면 작업 순서가 아주 잘 나와있다.
하지만, 그런다고 매번 프로그램을 그 순서에 따라 작성할 수는 없어 간단하게 CCPUUsage라는 클래스를 만들었다.
위의 코드는 클래스 헤더의 일부이며, 이 중 public: 부분만 정리한 것이다.
CCPUUsage 클래스의 인스턴스를 생성한 뒤에 측정을 시작하는 위치에서 GetInitValues()를 호출한 뒤, 측정을 끝낼 위치에서 다시 GetValues()를 호출하면 된다.
결과는 dUsage[코어개수+1]에 저장되는데, [0~코어개수-1] 까지는 각 코어의 사용량이고, [코어개수]엔 평균치가 저장된다.
즉, 쿼드코어의 경우 dUsage[0~4]에 저장되며, dUsage[0~3]은 각 코어의 사용량, dUsage[4]는 평균치가 저장된다.
아래 압축파일을 다운받아 사용하면 되며, 이 코드는 Visual C++ 2008에서 테스트되었다.
덧. 참고한 원래 소스는 Visual C++ 6.0 용이었는데, 실행이 제대로 되지 않았다.
확인해보니 _wtol()가 내가 원하는 대로 동작하지 않은 것이 원인이었다.
결과가 ULONG의 범위를 벗어나면 오버플로우가 발생한 뒤에, 똑같은 값만 나오는 것이다.
그래서, ULONG 대신 __int64를 사용하고, _wtoi64() 사용해버렸다.
그런데, 그 방법으로는 멀티코어 CPU에서의 코어 별 사용량을 알 수가 없다.
해결책을 뒤진 결과 Code Project: Getting CPU Usage in a Multiprocessor Machine라는 글을 찾을 수 있었다.
(이 글에 따르면) WMI(Windows Management and Instrumentation)를 이용해야 하며, Win32_PerfRawData_PerfOS_Processor 클래스를 사용하면 원하는 결과를 얻을 수 있다.
위의 글을 보면 작업 순서가 아주 잘 나와있다.
하지만, 그런다고 매번 프로그램을 그 순서에 따라 작성할 수는 없어 간단하게 CCPUUsage라는 클래스를 만들었다.
class CCPUUsage
{
public:
...
protected:
...
public:
double *dUsage;
BOOL GetInitValues();
void GetValues();
int inline iNumProc()
{ return iNproc; }
BOOL inline bOK()
{ return bInitialized; }
};
위의 코드는 클래스 헤더의 일부이며, 이 중 public: 부분만 정리한 것이다.
CCPUUsage 클래스의 인스턴스를 생성한 뒤에 측정을 시작하는 위치에서 GetInitValues()를 호출한 뒤, 측정을 끝낼 위치에서 다시 GetValues()를 호출하면 된다.
{
CCPUUsage cpuusage;
BOOL bOK = cpuusage.GetInitValues();
//작업 시작
...
//작업 종료
if (bOK)
{
cpuusage.GetValues();
for (int i=0; i<=cpuusage.iNumProc(); i++)
printf("%g\n", cpuusage.dUsage[i]);
}
}
결과는 dUsage[코어개수+1]에 저장되는데, [0~코어개수-1] 까지는 각 코어의 사용량이고, [코어개수]엔 평균치가 저장된다.
즉, 쿼드코어의 경우 dUsage[0~4]에 저장되며, dUsage[0~3]은 각 코어의 사용량, dUsage[4]는 평균치가 저장된다.
아래 압축파일을 다운받아 사용하면 되며, 이 코드는 Visual C++ 2008에서 테스트되었다.
덧. 참고한 원래 소스는 Visual C++ 6.0 용이었는데, 실행이 제대로 되지 않았다.
확인해보니 _wtol()가 내가 원하는 대로 동작하지 않은 것이 원인이었다.
결과가 ULONG의 범위를 벗어나면 오버플로우가 발생한 뒤에, 똑같은 값만 나오는 것이다.
그래서, ULONG 대신 __int64를 사용하고, _wtoi64() 사용해버렸다.
'컴퓨터야그 > 자작' 카테고리의 다른 글
캡쳐한 거대 위성사진 쉽게 자르기 (goohwan님 전용) 업데이트(100825) (14) | 2010.08.25 |
---|---|
디카 메모리가 부족하다고 풍경을 마음에 담을 순 없다! (캐궁극 버전) (6) | 2010.06.26 |
더 빠른 jpeg 라이브러리 jpeg-turbo 컴파일 삽질기 (4) | 2010.06.22 |
빠른 jpeg 라이브러리 x86 SIMD ext for IJG JPEG 컴파일 삽질기 (3) | 2010.06.21 |
OpenMP로 처음으로 만들어본 멀티코어 프로그램 (4) | 2010.06.20 |
Recent comment