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