C#でCPU機能を読み出す

CPUの機能を読み出し、それを表示してみましょう。

using System.Runtime.Intrinsics.X86;

namespace ConsoleApp
{
    class Program
    {
        [Flags]
        private enum _ECX       // CpuId(1, 0)
        {
            SSE3 = (1 << 0),
            PCLMULQDQ = (1 << 1),
            DTES64 = (1 << 2),
            MONITOR = (1 << 3),
            DS_CPL = (1 << 4),
            VMX = (1 << 5),
            SMX = (1 << 6),
            EST = (1 << 7),
            TM2 = (1 << 8),
            SSSE3 = (1 << 9),
            CNXT_ID = (1 << 10),
            SDBG = (1 << 11),
            FMA = (1 << 12),
            CX16 = (1 << 13),
            XTPR = (1 << 14),
            PDCM = (1 << 15),
            PCID = (1 << 17),
            DCA = (1 << 18),
            SSE41 = (1 << 19),
            SSE42 = (1 << 20),
            X2APIC = (1 << 21),
            MOVBE = (1 << 22),
            POPCNT = (1 << 23),
            TSC_DEADLINE = (1 << 24),
            AES = (1 << 25),
            XSAVE = (1 << 26),
            OSXSAVE = (1 << 27),
            AVX = (1 << 28),
            F16C = (1 << 29),
            RDRND = (1 << 30),
            HYPERVISOR = (1 << 31)
        }

        [Flags]
        private enum _EDX       // CpuId(1, 0)
        {
            FPU = (1 << 0),
            VME = (1 << 1),
            DE = (1 << 2),
            PSE = (1 << 3),
            TSC = (1 << 4),
            MSR = (1 << 5),
            PAE = (1 << 6),
            MCE = (1 << 7),
            CX8 = (1 << 8),
            APIC = (1 << 9),
            SEP = (1 << 11),
            MTRR = (1 << 12),
            PGE = (1 << 13),
            MCA = (1 << 14),
            CMOV = (1 << 15),
            PAT = (1 << 16),
            PSE_36 = (1 << 17),
            PSN = (1 << 18),
            CLFSH = (1 << 19),
            DS = (1 << 21),
            ACPI = (1 << 22),
            MMX = (1 << 23),
            FXSR = (1 << 24),
            SSE = (1 << 25),
            SSE2 = (1 << 26),
            SS = (1 << 27),
            HTT = (1 << 28),
            TM = (1 << 29),
            IA64 = (1 << 30),
            PBE = (1 << 31)
        }

        [Flags]
        private enum _EBX       // CpuId(7, 0)
        {
            AVX2 = (1 << 5),
            AVX512F = (1 << 16)
        }

        static void dipsFeatures(string str, bool bit)
        {
            if (bit)
                Console.WriteLine(str);
        }

        static void Main(string[] args)
        {
            int eax, ebx, ecx, edx;
            (eax, _, _, _) = X86Base.CpuId(0, 0);
            if (eax >= 1)
            {
                (_, _, ecx, edx) = X86Base.CpuId(1, 0);
                _EDX _edx = (_EDX)edx;
                dipsFeatures("FPU    ", _edx.HasFlag(_EDX.FPU));
                dipsFeatures("VME    ", _edx.HasFlag(_EDX.VME));
                dipsFeatures("DE     ", _edx.HasFlag(_EDX.DE));
                dipsFeatures("PSE    ", _edx.HasFlag(_EDX.PSE));
                dipsFeatures("TSC    ", _edx.HasFlag(_EDX.TSC));
                dipsFeatures("MSR    ", _edx.HasFlag(_EDX.MSR));
                dipsFeatures("PAE    ", _edx.HasFlag(_EDX.PAE));
                dipsFeatures("MCE    ", _edx.HasFlag(_EDX.MCE));
                dipsFeatures("CX8    ", _edx.HasFlag(_EDX.CX8));
                dipsFeatures("APIC   ", _edx.HasFlag(_EDX.APIC));
                dipsFeatures("SEP    ", _edx.HasFlag(_EDX.SEP));
                dipsFeatures("MTRR   ", _edx.HasFlag(_EDX.MTRR));
                dipsFeatures("PGE    ", _edx.HasFlag(_EDX.PGE));
                dipsFeatures("MCA    ", _edx.HasFlag(_EDX.MCA));
                dipsFeatures("CMOV   ", _edx.HasFlag(_EDX.CMOV));
                dipsFeatures("PAT    ", _edx.HasFlag(_EDX.PAT));
                dipsFeatures("PSE-36 ", _edx.HasFlag(_EDX.PSE_36));
                dipsFeatures("PSN    ", _edx.HasFlag(_EDX.PSN));
                dipsFeatures("CLFSH  ", _edx.HasFlag(_EDX.CLFSH));
                dipsFeatures("DS     ", _edx.HasFlag(_EDX.DS));
                dipsFeatures("ACPI   ", _edx.HasFlag(_EDX.ACPI));
                dipsFeatures("MMX    ", _edx.HasFlag(_EDX.MMX));
                dipsFeatures("FXSR   ", _edx.HasFlag(_EDX.FXSR));
                dipsFeatures("SSE    ", _edx.HasFlag(_EDX.SSE));
                dipsFeatures("SSE2   ", _edx.HasFlag(_EDX.SSE2));
                dipsFeatures("SS     ", _edx.HasFlag(_EDX.SS));
                dipsFeatures("HTT    ", _edx.HasFlag(_EDX.HTT));
                dipsFeatures("TM     ", _edx.HasFlag(_EDX.TM));
                dipsFeatures("IA64   ", _edx.HasFlag(_EDX.IA64));
                dipsFeatures("PBE    ", _edx.HasFlag(_EDX.PBE));


                _ECX _ecx = (_ECX)ecx;
                dipsFeatures("SSE3         ", _ecx.HasFlag(_ECX.SSE3));
                dipsFeatures("PCLMULQDQ    ", _ecx.HasFlag(_ECX.PCLMULQDQ));
                dipsFeatures("DTES64       ", _ecx.HasFlag(_ECX.DTES64));
                dipsFeatures("MONITOR      ", _ecx.HasFlag(_ECX.MONITOR));
                dipsFeatures("DS_CPL       ", _ecx.HasFlag(_ECX.DS_CPL));
                dipsFeatures("VMX          ", _ecx.HasFlag(_ECX.VMX));
                dipsFeatures("SMX          ", _ecx.HasFlag(_ECX.SMX));
                dipsFeatures("EST          ", _ecx.HasFlag(_ECX.EST));
                dipsFeatures("TM2          ", _ecx.HasFlag(_ECX.TM2));
                dipsFeatures("SSSE3        ", _ecx.HasFlag(_ECX.SSSE3));
                dipsFeatures("CNXT_ID      ", _ecx.HasFlag(_ECX.CNXT_ID));
                dipsFeatures("SDBG         ", _ecx.HasFlag(_ECX.SDBG));
                dipsFeatures("FMA          ", _ecx.HasFlag(_ECX.FMA));
                dipsFeatures("CX16         ", _ecx.HasFlag(_ECX.CX16));
                dipsFeatures("XTPR         ", _ecx.HasFlag(_ECX.XTPR));
                dipsFeatures("PDCM         ", _ecx.HasFlag(_ECX.PDCM));
                dipsFeatures("PCID         ", _ecx.HasFlag(_ECX.PCID));
                dipsFeatures("DCA          ", _ecx.HasFlag(_ECX.DCA));
                dipsFeatures("SSE41        ", _ecx.HasFlag(_ECX.SSE41));
                dipsFeatures("SSE42        ", _ecx.HasFlag(_ECX.SSE42));
                dipsFeatures("X2APIC       ", _ecx.HasFlag(_ECX.X2APIC));
                dipsFeatures("MOVBE        ", _ecx.HasFlag(_ECX.MOVBE));
                dipsFeatures("POPCNT       ", _ecx.HasFlag(_ECX.POPCNT));
                dipsFeatures("TSC_DEADLINE ", _ecx.HasFlag(_ECX.TSC_DEADLINE));
                dipsFeatures("AES          ", _ecx.HasFlag(_ECX.AES));
                dipsFeatures("XSAVE        ", _ecx.HasFlag(_ECX.XSAVE));
                dipsFeatures("OSXSAVE      ", _ecx.HasFlag(_ECX.OSXSAVE));
                dipsFeatures("AVX          ", _ecx.HasFlag(_ECX.AVX));
                dipsFeatures("F16C         ", _ecx.HasFlag(_ECX.F16C));
                dipsFeatures("RDRND        ", _ecx.HasFlag(_ECX.RDRND));
                dipsFeatures("HYPERVISOR   ", _ecx.HasFlag(_ECX.HYPERVISOR));

            }
            if (eax >= 7)
            {
                (_, ebx, _, _) = X86Base.CpuId(7, 0);
                _EBX _ebx = (_EBX)ebx;
                dipsFeatures("AVX2    ", _ebx.HasFlag(_EBX.AVX2));
                dipsFeatures("AVX512F ", _ebx.HasFlag(_EBX.AVX512F));
            }
        }
    }
}


CPU brand string: 11th Gen Intel(R) Core(TM) i5-1135G7 @ 2.40GHzで実行した例:

FPU
VME
DE
PSE
TSC
MSR
PAE
MCE
CX8
APIC
SEP
MTRR
PGE
MCA
CMOV
PAT
PSE-36
CLFSH
DS
ACPI
MMX
FXSR
SSE
SSE2
SS
HTT
TM
PBE
SSE3
PCLMULQDQ
DTES64
MONITOR
DS_CPL
VMX
EST
TM2
SSSE3
SDBG
FMA
CX16
XTPR
PDCM
PCID
SSE41
SSE42
X2APIC
MOVBE
POPCNT
TSC_DEADLINE
AES
XSAVE
OSXSAVE
AVX
F16C
RDRND
AVX2
AVX512F