Click here to Skip to main content
Licence 
First Posted 1 Feb 2005
Views 51,023
Bookmarked 18 times

Counting Physical and Logical Processors

By | 1 Feb 2005 | Article
How to determine the number of physical and logical processors on your computer.

Sample Image

Introduction

Contemporary Intel Pentium IV processors support the so called Hyper-Threading mode. With Hyper-Threading, a real physical processor presents itself to the operating system as two independent logical processors. Hyper-Threading technology lessens process switching overhead, increasing overall system throughput. But in some calculation intensive applications, this delusion of two logical processors may lead to the loss of effectiveness if the program will start two parallel threads, which will compete for one physical processor. Thus we have to determine how many physical processors we have in our computer to adjust the number of parallel threads to the number of physical processors. The latter utility shows how we can do it from a C# program.

Background

The CPU Counting utility is based on the following Intel documents and code samples:

Using the code

The CPU Counting utility consists of two parts - the client part and the server part. The client part written in C# calls the server function and displays its results. The server part actually determines the number of processors. It uses ASM commands extensively and therefore is written in managed C++.

The key part of the client is the call to the server function GetCPUCount.

int LogicalNum   = 0;  // Number of logical CPU per ONE PHYSICAL CPU
int PhysicalNum  = 0;  // Total number of physical processor
CPUCountStatus HTStatusFlag = 0;

HTStatusFlag = CPUCount.GetCPUCount(ref LogicalNum, ref PhysicalNum);

Don't forget to add namespace usage statement.

using CPUCounter;

Server part is implemented as a separate DLL, containing static function GetCPUCount of the class CPUCount.

// CPUCount.h

#pragma once

#using   <mscorlib.dll>
using namespace System;

namespace CPUCounter
{
    public __value enum CPUCountStatus
    {
        HT_NOT_CAPABLE,
        HT_ENABLED,
        HT_DISABLED,
        HT_SUPPORTED_NOT_ENABLED,
        HT_CANNOT_DETECT
    };

    public __value class CPUCount
    {
        public:
            static CPUCountStatus GetCPUCount(int __gc* LogicalNum, 
                                              int __gc* PhysicalNum);
    };

    unsigned int  HTSupported();
    unsigned int LogicalProcPerPhysicalProc();
    unsigned int GetAPIC_ID();
    CPUCountStatus DefineCPUCount(int __gc* LogicalNum, 
                                  int __gc* PhysicalNum);

}

Function GetCPUCount returns value of CPUCountStatus enum type. Meaning of CPUCountStatus values are:

HT_NOT_CAPABLE Hyper-threading technology doesn't exist in this system.
HT_ENABLED Hyper-threading technology is enabled in this system.
HT_DISABLED Hyper-threading technology is disabled in the hardware.
HT_SUPPORTED_NOT_ENABLED Hyper-threading technology is supported but disabled in the BIOS.
HT_CANNOT_DETECT Hyper-threading technology cannot be detected

To determine hyper-threading possibilities and the number of physical and logical processors in your computer, just copy the files CPUCounterClient.exe and CPUCounter.dll to some directory and run CPUCounterClient.exe.

History

This is the first version of the CPU counting utility.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Gregory Gintsberg

Web Developer

Israel Israel

Member

I am free-lance software and algorithms developer and consultant.
I program computers for almost 40 years starting with machine code to contemporary high level languages, and programming is still a greate fun for me.


Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
Generalbad result on core i7 PinmemberAlexandre GRANVAUD3:21 28 Dec '10  
QuestionHow to make this work on x64? Pinmemberjlilley8:13 25 Jun '09  
AnswerRe: How to make this work on x64? Pinmemberdan_linder5:50 9 Oct '09  
GeneralThis article is just a copy of the Intel sample PinmemberJon23:18 2 Jan '07  
GeneralDual core Pinmemberkhb2:48 14 Jul '06  
Hi Gregory,
 
your solution works very well for me. Well, unless I try to count the CPUs on a Pentium D dual core machine. The machine has also HT. As result I get 1 physical and 2 logical CPUs, but would expect also 2 physical CPUs. Do you have any idea how to count the cores?
 
Thank you for your article!
 
Regards,
Marcus.
GeneralRe: Dual core Pinmemberdan_linder6:02 9 Oct '09  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web01 | 2.5.120529.1 | Last Updated 1 Feb 2005
Article Copyright 2005 by Gregory Gintsberg
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid