From e82a547bce2366de3d5915d85f951c0acfe32fc3 Mon Sep 17 00:00:00 2001 From: zzz Date: Thu, 6 Jun 2019 13:28:44 +0000 Subject: [PATCH] CPUID/NBI: Prep for GMP 6.1.2 Add Skylake support (ticket #1869) Recognize more Intel "Lake" processors Clean up CLI output --- .../freenet/support/CPUInformation/CPUID.java | 72 ++++++++++--------- .../support/CPUInformation/IntelCPUInfo.java | 7 ++ .../support/CPUInformation/IntelInfoImpl.java | 42 +++++++++-- .../src/net/i2p/util/NativeBigInteger.java | 8 ++- 4 files changed, 88 insertions(+), 41 deletions(-) diff --git a/core/java/src/freenet/support/CPUInformation/CPUID.java b/core/java/src/freenet/support/CPUInformation/CPUID.java index 82df6138f..1e0cdbcdd 100644 --- a/core/java/src/freenet/support/CPUInformation/CPUID.java +++ b/core/java/src/freenet/support/CPUInformation/CPUID.java @@ -340,12 +340,12 @@ public class CPUID { name + " file in the library path, or set -Djava.library.path=. in the command line"); } System.out.println("JCPUID Version: " + _jcpuidVersion); - System.out.println(" **CPUInfo**"); + System.out.println("**CPUInfo**"); String mname = getCPUModelName(); if (mname != null) - System.out.println("CPU Model Name: " + mname); + System.out.println("CPU Name: " + mname); String vendor = getCPUVendorID(); - System.out.println("CPU Vendor: " + vendor); + System.out.println("CPU Vendor: " + vendor); // http://en.wikipedia.org/wiki/Cpuid // http://web.archive.org/web/20110307080258/http://www.intel.com/Assets/PDF/appnote/241618.pdf // http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-2a-manual.pdf @@ -358,8 +358,8 @@ public class CPUID { if (family == 15) { family += getCPUExtendedFamily(); } - System.out.println("CPU Family: " + family); - System.out.println("CPU Model: " + model); + System.out.println("CPU Family: " + family); + System.out.println("CPU Model: " + model + " (0x" + Integer.toHexString(model) + ')'); System.out.println("CPU Stepping: " + getCPUStepping()); System.out.println("CPU Flags (EDX): 0x" + Integer.toHexString(getEDXCPUFlags())); System.out.println("CPU Flags (ECX): 0x" + Integer.toHexString(getECXCPUFlags())); @@ -369,8 +369,8 @@ public class CPUID { System.out.println("CPU Ext. Feat. (ECX): 0x" + Integer.toHexString(getExtendedECXFeatureFlags())); CPUInfo c = getInfo(); - System.out.println("\n **More CPUInfo**"); - System.out.println("CPU model string: " + c.getCPUModelString()); + System.out.println("\n**More CPUInfo**"); + System.out.println("CPU model name: " + c.getCPUModelString()); System.out.println("CPU has MMX: " + c.hasMMX()); System.out.println("CPU has SSE: " + c.hasSSE()); System.out.println("CPU has SSE2: " + c.hasSSE2()); @@ -390,34 +390,36 @@ public class CPUID { System.out.println("CPU has MOVBE: " + c.hasMOVBE()); System.out.println("CPU has ABM: " + c.hasABM()); if(c instanceof IntelCPUInfo){ - System.out.println("\n **Intel-info**"); - System.out.println("Is PII-compatible: "+((IntelCPUInfo)c).IsPentium2Compatible()); - System.out.println("Is PIII-compatible: "+((IntelCPUInfo)c).IsPentium3Compatible()); - System.out.println("Is PIV-compatible: "+((IntelCPUInfo)c).IsPentium4Compatible()); - System.out.println("Is Atom-compatible: "+((IntelCPUInfo)c).IsAtomCompatible()); - System.out.println("Is Pentium M compatible: "+((IntelCPUInfo)c).IsPentiumMCompatible()); - System.out.println("Is Core2-compatible: "+((IntelCPUInfo)c).IsCore2Compatible()); - System.out.println("Is Corei-compatible: "+((IntelCPUInfo)c).IsCoreiCompatible()); - System.out.println("Is Sandy-compatible: "+((IntelCPUInfo)c).IsSandyCompatible()); - System.out.println("Is Ivy-compatible: "+((IntelCPUInfo)c).IsIvyCompatible()); - System.out.println("Is Haswell-compatible: "+((IntelCPUInfo)c).IsHaswellCompatible()); - System.out.println("Is Broadwell-compatible: "+((IntelCPUInfo)c).IsBroadwellCompatible()); - } - if(c instanceof AMDCPUInfo){ - System.out.println("\n **AMD-info**"); - System.out.println("Is K6-compatible: "+((AMDCPUInfo)c).IsK6Compatible()); - System.out.println("Is K6_2-compatible: "+((AMDCPUInfo)c).IsK6_2_Compatible()); - System.out.println("Is K6_3-compatible: "+((AMDCPUInfo)c).IsK6_3_Compatible()); - System.out.println("Is Geode-compatible: "+((AMDCPUInfo)c).IsGeodeCompatible()); - System.out.println("Is Athlon-compatible: "+((AMDCPUInfo)c).IsAthlonCompatible()); - System.out.println("Is Athlon64-compatible: "+((AMDCPUInfo)c).IsAthlon64Compatible()); - System.out.println("Is Bobcat-compatible: "+((AMDCPUInfo)c).IsBobcatCompatible()); - System.out.println("Is K10-compatible: "+((AMDCPUInfo)c).IsK10Compatible()); - System.out.println("Is Jaguar-compatible: "+((AMDCPUInfo)c).IsJaguarCompatible()); - System.out.println("Is Bulldozer-compatible: "+((AMDCPUInfo)c).IsBulldozerCompatible()); - System.out.println("Is Piledriver-compatible: "+((AMDCPUInfo)c).IsPiledriverCompatible()); - System.out.println("Is Steamroller-compatible: "+((AMDCPUInfo)c).IsSteamrollerCompatible()); - System.out.println("Is Excavator-compatible: "+((AMDCPUInfo)c).IsExcavatorCompatible()); + IntelCPUInfo cc = (IntelCPUInfo) c; + System.out.println("\n**Intel-info**"); + System.out.println("Is PII-compatible: " + cc.IsPentium2Compatible()); + System.out.println("Is PIII-compatible: " + cc.IsPentium3Compatible()); + System.out.println("Is PIV-compatible: " + cc.IsPentium4Compatible()); + System.out.println("Is Atom-compatible: " + cc.IsAtomCompatible()); + System.out.println("Is Pentium M compatible: " + cc.IsPentiumMCompatible()); + System.out.println("Is Core2-compatible: " + cc.IsCore2Compatible()); + System.out.println("Is Corei-compatible: " + cc.IsCoreiCompatible()); + System.out.println("Is Sandy-compatible: " + cc.IsSandyCompatible()); + System.out.println("Is Ivy-compatible: " + cc.IsIvyCompatible()); + System.out.println("Is Haswell-compatible: " + cc.IsHaswellCompatible()); + System.out.println("Is Broadwell-compatible: " + cc.IsBroadwellCompatible()); + System.out.println("Is Skylake-compatible: " + cc.IsSkylakeCompatible()); + } else if (c instanceof AMDCPUInfo) { + AMDCPUInfo cc = (AMDCPUInfo) c; + System.out.println("\n**AMD-info**"); + System.out.println("Is K6-compatible: " + cc.IsK6Compatible()); + System.out.println("Is K6_2-compatible: " + cc.IsK6_2_Compatible()); + System.out.println("Is K6_3-compatible: " + cc.IsK6_3_Compatible()); + System.out.println("Is Geode-compatible: " + cc.IsGeodeCompatible()); + System.out.println("Is Athlon-compatible: " + cc.IsAthlonCompatible()); + System.out.println("Is Athlon64-compatible: " + cc.IsAthlon64Compatible()); + System.out.println("Is Bobcat-compatible: " + cc.IsBobcatCompatible()); + System.out.println("Is K10-compatible: " + cc.IsK10Compatible()); + System.out.println("Is Jaguar-compatible: " + cc.IsJaguarCompatible()); + System.out.println("Is Bulldozer-compatible: " + cc.IsBulldozerCompatible()); + System.out.println("Is Piledriver-compatible: " + cc.IsPiledriverCompatible()); + System.out.println("Is Steamroller-compatible: " + cc.IsSteamrollerCompatible()); + System.out.println("Is Excavator-compatible: " + cc.IsExcavatorCompatible()); } } diff --git a/core/java/src/freenet/support/CPUInformation/IntelCPUInfo.java b/core/java/src/freenet/support/CPUInformation/IntelCPUInfo.java index d2c99df1e..d70aa21e9 100644 --- a/core/java/src/freenet/support/CPUInformation/IntelCPUInfo.java +++ b/core/java/src/freenet/support/CPUInformation/IntelCPUInfo.java @@ -139,4 +139,11 @@ public interface IntelCPUInfo extends CPUInfo { * @since 0.9.26 */ public boolean IsBroadwellCompatible(); + + /** + * Supports the AVX-512 instrutions. + * + * @since 0.9.41 + */ + public boolean IsSkylakeCompatible(); } diff --git a/core/java/src/freenet/support/CPUInformation/IntelInfoImpl.java b/core/java/src/freenet/support/CPUInformation/IntelInfoImpl.java index 21b1dde09..16f21d70b 100644 --- a/core/java/src/freenet/support/CPUInformation/IntelInfoImpl.java +++ b/core/java/src/freenet/support/CPUInformation/IntelInfoImpl.java @@ -23,6 +23,7 @@ class IntelInfoImpl extends CPUIDCPUInfo implements IntelCPUInfo private static boolean isIvyCompatible; private static boolean isHaswellCompatible; private static boolean isBroadwellCompatible; + private static boolean isSkylakeCompatible; // If modelString != null, the cpu is considered correctly identified. private static final String smodel = identifyCPU(); @@ -39,6 +40,11 @@ class IntelInfoImpl extends CPUIDCPUInfo implements IntelCPUInfo public boolean IsIvyCompatible(){ return isIvyCompatible; } public boolean IsHaswellCompatible(){ return isHaswellCompatible; } public boolean IsBroadwellCompatible(){ return isBroadwellCompatible; } + /** + * Supports the AVX-512 instrutions. + * @since 0.9.41 + */ + public boolean IsSkylakeCompatible() { return isSkylakeCompatible; } public String getCPUModelString() throws UnknownCPUException { @@ -61,6 +67,10 @@ class IntelInfoImpl extends CPUIDCPUInfo implements IntelCPUInfo if (family == 15 || family == 6) { // Intel uses extended model for family = 15 or family = 6, // which is not what wikipedia says + // we construct the model from EAX as follows: + // ext. model is 5th byte, base model is 2nd byte + // So e.g. for a published CPUID value of "306C1" + // the model here would be 0x3c, it's a Haswell. model += CPUID.getCPUExtendedModel() << 4; } if (family == 15) { @@ -439,15 +449,23 @@ class IntelInfoImpl extends CPUIDCPUInfo implements IntelCPUInfo // See Haswell notes above case 0x4e: case 0x55: - case 0x5e: { + case 0x5c: // Apollo Lake + case 0x5e: + case 0x66: // Cannon Lake + case 0x67: // Cannon Lake + case 0x6c: // Apollo Lake + { CPUIDCPUInfo c = new CPUIDCPUInfo(); if (c.hasAVX2() && c.hasBMI1() && c.hasBMI2() && c.hasFMA3() && c.hasMOVBE() && c.hasABM()) { isSandyCompatible = true; isIvyCompatible = true; isHaswellCompatible = true; - if (c.hasADX()) + if (c.hasADX()) { isBroadwellCompatible = true; + if (c.hasAVX512()) + isSkylakeCompatible = true; + } modelString = "Skylake Core i3/i5/i7"; } else { // This processor is "corei" compatible, as we define it, @@ -463,23 +481,37 @@ class IntelInfoImpl extends CPUIDCPUInfo implements IntelCPUInfo break; } + + // TODO case 0x5f: // Goldmont / Atom + // TODO case 0x7a: // Gemini Lake + // TODO case 0x7e: // Ice Lake + + // following are for extended model == 8 or 9 // most flags are set above // isCoreiCompatible = true is the default // Kaby Lake // ref: https://github.com/InstLatx64/InstLatx64/commit/9d2ea1a9eb727868dc514900da9e2f175710f9bf + // ref: https://github.com/InstLatx64/InstLatx64/blob/master/ChangeLog.htm + // ref: https://github.com/coreboot/coreboot/blob/master/src/soc/intel/common/block/include/intelblocks/mp_init.h // See Haswell notes above - case 0x8e: - case 0x9e: { + case 0x8e: // also Whiskey Lake, Coffee Lake + case 0x9e: // also Whiskey Lake, Coffee Lake + case 0xa5: // Comet Lake + case 0xa6: // Comet Lake + { CPUIDCPUInfo c = new CPUIDCPUInfo(); if (c.hasAVX2() && c.hasBMI1() && c.hasBMI2() && c.hasFMA3() && c.hasMOVBE() && c.hasABM()) { isSandyCompatible = true; isIvyCompatible = true; isHaswellCompatible = true; - if (c.hasADX()) + if (c.hasADX()) { isBroadwellCompatible = true; + if (c.hasAVX512()) + isSkylakeCompatible = true; + } modelString = "Kaby Lake Core i3/i5/i7"; } else { // This processor is "corei" compatible, as we define it, diff --git a/core/java/src/net/i2p/util/NativeBigInteger.java b/core/java/src/net/i2p/util/NativeBigInteger.java index e64a38e04..29baa7ded 100644 --- a/core/java/src/net/i2p/util/NativeBigInteger.java +++ b/core/java/src/net/i2p/util/NativeBigInteger.java @@ -172,6 +172,8 @@ public class NativeBigInteger extends BigInteger { private final static String JBIGI_OPTIMIZATION_EXCAVATOR = "excavator"; private final static String JBIGI_OPTIMIZATION_BOBCAT = "bobcat"; private final static String JBIGI_OPTIMIZATION_JAGUAR = "jaguar"; + /** @since 0.9.41 */ + private final static String JBIGI_OPTIMIZATION_SKYLAKE = "skylake"; /** * Non-x86, no fallbacks to older libs or to "none" @@ -233,7 +235,8 @@ public class NativeBigInteger extends BigInteger { private final static String[] JBIGI_COMPAT_LIST_INTEL_PENTIUM = {JBIGI_OPTIMIZATION_PENTIUM4, JBIGI_OPTIMIZATION_PENTIUMM, JBIGI_OPTIMIZATION_PENTIUM3, JBIGI_OPTIMIZATION_PENTIUM2, JBIGI_OPTIMIZATION_PENTIUMMMX, JBIGI_OPTIMIZATION_PENTIUM, JBIGI_OPTIMIZATION_X86}; - private final static String[] JBIGI_COMPAT_LIST_INTEL_CORE = {JBIGI_OPTIMIZATION_COREI_BWL, JBIGI_OPTIMIZATION_COREI_HWL, JBIGI_OPTIMIZATION_COREI_SBR, + private final static String[] JBIGI_COMPAT_LIST_INTEL_CORE = {JBIGI_OPTIMIZATION_SKYLAKE, + JBIGI_OPTIMIZATION_COREI_BWL, JBIGI_OPTIMIZATION_COREI_HWL, JBIGI_OPTIMIZATION_COREI_SBR, JBIGI_OPTIMIZATION_COREI, JBIGI_OPTIMIZATION_CORE2, JBIGI_OPTIMIZATION_PENTIUMM, JBIGI_OPTIMIZATION_PENTIUM3, JBIGI_OPTIMIZATION_X86}; @@ -293,6 +296,7 @@ public class NativeBigInteger extends BigInteger { put(JBIGI_OPTIMIZATION_COREI_SBR, JBIGI_COMPAT_LIST_INTEL_CORE); put(JBIGI_OPTIMIZATION_COREI_HWL, JBIGI_COMPAT_LIST_INTEL_CORE); put(JBIGI_OPTIMIZATION_COREI_BWL, JBIGI_COMPAT_LIST_INTEL_CORE); + put(JBIGI_OPTIMIZATION_SKYLAKE, JBIGI_COMPAT_LIST_INTEL_CORE); }}; /** @@ -387,6 +391,8 @@ public class NativeBigInteger extends BigInteger { return JBIGI_OPTIMIZATION_K6; } else if (c instanceof IntelCPUInfo) { IntelCPUInfo intelcpu = (IntelCPUInfo) c; + if (intelcpu.IsSkylakeCompatible()) + return JBIGI_OPTIMIZATION_SKYLAKE; if (intelcpu.IsBroadwellCompatible()) return JBIGI_OPTIMIZATION_COREI_BWL; if (intelcpu.IsHaswellCompatible())