Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Tìm số nhân CPU Core trong C#

Có 3 khái niệm quan trọng về CPU topology:

  • Physical Processors (Sockets): Số CPU socket vật lý trên mainboard.
  • Cores: Số core vật lý trên mỗi socket.
  • Logical Processors: Số thread logic (Core * Hyper-threading factor). Đây là số thread có thể chạy đồng thời thực sự.

1. Logical Processors (Environment.ProcessorCount) - Dễ nhất


int logicalCount = Environment.ProcessorCount;
Console.WriteLine($"Logical Processors: {logicalCount}");
// Output: 8 (ví dụ: 4 cores + Hyper-threading)

Đây là số thread có thể chạy song song. Phổ biến nhất để cấu hình MaxDegreeOfParallelism, thread pool size.

2. Physical Processors & Cores (WMI - Windows only)


using System.Management; // NuGet: System.Management (Windows only)

public static void PrintCpuInfo()
{
    // Physical Processors (Sockets)
    int physicalProcessors = 0;
    foreach (var item in new ManagementObjectSearcher("SELECT NumberOfProcessors FROM Win32_ComputerSystem").Get())
        physicalProcessors = Convert.ToInt32(item["NumberOfProcessors"]);
    
    // Cores (tổng số core vật lý)
    int coreCount = 0;
    foreach (var item in new ManagementObjectSearcher("SELECT NumberOfCores FROM Win32_Processor").Get())
        coreCount += Convert.ToInt32(item["NumberOfCores"]);
    
    // Logical Processors (tổng)
    int logicalProcessors = 0;
    foreach (var item in new ManagementObjectSearcher("SELECT NumberOfLogicalProcessors FROM Win32_Processor").Get())
        logicalProcessors += Convert.ToInt32(item["NumberOfLogicalProcessors"]);
    
    Console.WriteLine($"Physical Processors (Sockets): {physicalProcessors}");
    Console.WriteLine($"Total Cores: {coreCount}");
    Console.WriteLine($"Total Logical Processors: {logicalProcessors}");
    Console.WriteLine($"Environment.ProcessorCount: {Environment.ProcessorCount}");
}

Kết quả mẫu


Physical Processors (Sockets): 1
Total Cores: 4
Total Logical Processors: 8
Environment.ProcessorCount: 8

3. Cross-platform (.NET Core / .NET 5+) - Không có API built-in cho Physical/Core

.NET không cung cấp API cross-platform để lấy physical cores/sockets. Các lựa chọn:

  • Linux: Parse /proc/cpuinfo hoặc lscpu.
  • macOS: sysctl -n hw.physicalcpu hw.logicalcpu.
  • Thư viện: System.Management (Windows), Microsoft.Win32.Registry, hoặc P/Invoke.

Ví dụ Cross-platform helper (Linux/macOS/Windows)


public static class CpuInfo
{
    public static int LogicalCount => Environment.ProcessorCount;
    
    public static (int Physical, int Cores, int Logical) GetDetails()
    {
        if (OperatingSystem.IsWindows())
            return GetWindowsDetails();
        else if (OperatingSystem.IsLinux())
            return GetLinuxDetails();
        else if (OperatingSystem.IsMacOS())
            return GetMacOSDetails();
        else
            return (0, 0, LogicalCount);
    }
    
    private static (int, int, int) GetWindowsDetails()
    {
        // WMI code như trên
        return (physical, cores, logical);
    }
    
    private static (int, int, int) GetLinuxDetails()
    {
        // Parse /proc/cpuinfo
        // physical id -> sockets, cpu cores -> cores per socket, processor -> logical
        return (0, 0, LogicalCount); // Simplified
    }
    
    private static (int, int, int) GetMacOSDetails()
    {
        // sysctl
        return (0, 0, LogicalCount); // Simplified
    }
}

Khi nào dùng cái nào?

MetricDùng cho
Environment.ProcessorCountParallel.ForEach MaxDegreeOfParallelism, ThreadPool sizing, Task partitioning, general concurrency limit.
Physical CoresCPU-bound workload tuning, affinity, licensing (per-core), NUMA awareness.
Physical SocketsNUMA topology, memory locality, server licensing.

Lưu ý: Trong container (Docker/K8s), Environment.ProcessorCount phản ánh CPU limit của container (cgroups), không phải host. Rất quan trọng cho cloud-native apps.