Skip to content

Latest commit

 

History

History
237 lines (191 loc) · 8.24 KB

README.md

File metadata and controls

237 lines (191 loc) · 8.24 KB


What is iCPUID?

iCPUID is a lightweight cross-platform implementation that allows us to obtain the CPUID information.

Works on Windows, Mac and Linux

Install via NuGet

NuGet Version

Install via PowerShell

Now if you want you can use iCPUID from PowerShell. It has the iPowerShellCpuid module available that contains a collection of Cmdlets that allow us to obtain the CPUID information. If you want to know more, please review the available documentation from here.

  • From PowerShellGallery
PowerShellGallery Version
  • From PowerShell console

PM> Install-Module -Name iPowerShellCpuid

Usage

Call CPUID.Instance.Leafs for getting all CPUID implemented leafs.

Examples

  1. Detection of the availability of the CPUID instruction.

    CPUID cpuid = CPUID.Instance;
    Console.WriteLine($@" Is Available > {cpuid.IsAvailable}");
    
  2. Gets and prints all CPUID implemented leafs.

    CPUID cpuid = CPUID.Instance;
    ReadOnlyCollection<Leaf> leafs = cpuid.ImplementedLeafs;
    foreach (Leaf leaf in leafs)
    {
        Console.WriteLine($@" {(int)leaf:X8}-{leaf}");
    }
    
  3. Gets and prints all CPUID leafs > sub-leafs.

    CPUID cpuid = CPUID.Instance;
    CpuidLeafDictionary? leafs = cpuid.Leafs;
    foreach (var (leaf, subLeafs) in leafs)
    {
        Console.WriteLine($@" > {leaf} (EAX={(int)leaf:X8})");
    
        foreach (var subLeaf in subLeafs)
        {
            Console.WriteLine($@"   > {subLeaf.SubLeaf} ");
        }
     
         Console.WriteLine();
     }
    
  4. Gets and prints all CPUID leafs > sub-leafs (shows description).

    CPUID cpuid = CPUID.Instance;
    CpuidLeafDictionary? leafs = cpuid.Leafs;
    foreach (var (leaf, subLeafs) in leafs)
    {
        Console.WriteLine($@" > {leaf} (EAX={(int)leaf:X8})");
    
        foreach (var subLeaf in subLeafs)
        {
            Console.WriteLine($@"   > {subLeaf.SubLeaf} (ECX={(int)subLeaf.SubLeaf:X8})");
        }
    
        Console.WriteLine();
    }
    
  5. Gets and prints all CPUID leafs > sub-leafs (values).

    CPUID cpuid = CPUID.Instance;
    CpuidLeafDictionary? leafs = cpuid.Leafs;
    foreach (var (leaf, subLeafs) in leafs)
    {
        Console.WriteLine($@" > {leaf} (EAX={(int)leaf:X8})");
    
        foreach (var subLeaf in subLeafs)
        {
            Console.WriteLine($@"   > {subLeaf.SubLeaf} (ECX={(int)subLeaf.SubLeaf:X8})");
            IEnumerable<IPropertyKey> properties = subLeaf.ImplementedProperties;
            foreach (IPropertyKey property in properties)
            {
                QueryPropertyResult queryResult = subLeaf.GetProperty(property);
                PropertyItem propertyItem = queryResult.Result;
                object value = propertyItem.Value;
                PropertyUnit valueUnit = property.PropertyUnit;
                string friendlyName = property.GetPropertyName();
                string unit = valueUnit == PropertyUnit.None ? string.Empty : valueUnit.ToString();
    
                if (value == null)
                {
                    Console.WriteLine($@"     > {friendlyName}: NULL");
                    continue;
                }
    
                if (value is bool)
                {
                    Console.WriteLine($@"     > {friendlyName}: {value} [{((bool)value ? 1 : 0)}]");
                }
                else if (value is string)
                {
                    Console.WriteLine($@"     > {friendlyName}: {value} {unit}");
                }
                else if (value is byte)
                {
                     Console.WriteLine($@"     > {friendlyName}: {value} {unit} [{value:X2}h]");
                }
                else if (value is int)
                {
                    Console.WriteLine($@"     > {friendlyName}: {value} {unit} [{value:X4}h]");
                }
                else if (value is uint)
                {
                    Console.WriteLine($@"     > {friendlyName}: {value} {unit} [{value:X4}h]");
                }
                else if (value is ulong)
                {
                    Console.WriteLine($@"     > {friendlyName}: {value} {unit} [{value:X8}h]");
                }
                else if (value.GetType() == typeof(ReadOnlyCollection<string>))
                {
                    Console.WriteLine($@"     > {friendlyName}");
                    var collection = (ReadOnlyCollection<string>)value;
                    foreach (var entry in collection)
                    {
                        Console.WriteLine($@"       > {entry} {unit}");
                    }
                }
                else
                {
                    Console.WriteLine($@"     > {friendlyName}: {value} {unit}");
                }
            }
        }
    
         Console.WriteLine();
     }
    
  6. Gets a single property directly.

     CPUID cpuid = CPUID.Instance;
     QueryPropertyResult manufacturerQueryResult = cpuid.Leafs.GetProperty(LeafProperty.BasicInformation.Manufacturer);
     if (manufacturerQueryResult.Success)
     {
         Console.WriteLine($" > Manufacturer: {manufacturerQueryResult.Result.Value}");
     }
    
     QueryPropertyResult avx2 = cpuid.Leafs.GetProperty(LeafProperty.ExtendedFeatures.AVX2);
     if (avx2.Success)
     {
         Console.WriteLine($" > AVX2: {avx2.Result.Value}");
     }
    
  7. Gets a property in multiple elements directly.

      CPUID cpuid = CPUID.Instance;
      CpuidLeafDictionary? leafs = cpuid.Leafs;
      QuerySubLeafPropertyCollectionResult cacheSizesQueryResult = leafs.GetProperties(LeafProperty.DeterministicCacheParameters.CacheSize);
      if (cacheSizesQueryResult.Success)
      {
          CpuidSubLeafDictionary cacheSizes = cacheSizesQueryResult.Result;
          bool hasCacheSizesEntries = cacheSizes.Any();
          if (!hasCacheSizesEntries)
          {
              Console.WriteLine($@" > Sorry, The 'LeafProperty.DeterministicCacheParameters.CacheSize' property has not implementes on this system");
          }
          else
          {
              foreach (var (subLeaf, propertyItem) in cacheSizes)
              {
                  Console.WriteLine($@" > Cache Size:  ({subLeaf}) > {propertyItem.Value} {propertyItem.Key.PropertyUnit}");
              }
          }
      }
    

Documentation

  • For full code documentation, please see next link documentation.

How can I send feedback!!!

If you have found iCPUID useful at work or in a personal project, I would love to hear about it. If you have decided not to use iCPUID, please send me and email stating why this is so. I will use this feedback to improve iCPUID in future releases.

My email address is

email.png