From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Martijn Muijsers Date: Thu, 24 Nov 2022 01:19:12 +0100 Subject: [PATCH] SIMD support License: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) Gale - https://galemc.org This patch is based on the following patch: "Add SIMD utilities" By: Kevin Raneri As part of: Pufferfish (https://github.com/pufferfish-gg/Pufferfish) Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) diff --git a/build.gradle.kts b/build.gradle.kts index 9606c6954f2c53dbbda7e7235cf37308822fea02..4466f21a83cb9ddca7309a194afcb8eded92de81 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -73,6 +73,7 @@ tasks.withType { compilerArgs.add("-Xlint:-module") compilerArgs.add("-Xlint:-removal") compilerArgs.add("-Xlint:-dep-ann") + compilerArgs.add("--add-modules=jdk.incubator.vector") // Gale - Pufferfish - SIMD support } // Gale end - hide irrelevant compilation warnings @@ -199,6 +200,7 @@ fun TaskContainer.registerRunTask( minHeapSize = "${memoryGb}G" maxHeapSize = "${memoryGb}G" jvmArgs("--enable-preview") // Gale - enable preview features for development runs + jvmArgs("--add-modules=jdk.incubator.vector") // Gale - Pufferfish - SIMD support doFirst { workingDir.mkdirs() diff --git a/src/main/java/com/destroystokyo/paper/Metrics.java b/src/main/java/com/destroystokyo/paper/Metrics.java index 2acad4c3fd58178b0f8b22bdb04eeeeb689d5afa..850ccd53c5007e8b18344ba76c9e7f0003decaff 100644 --- a/src/main/java/com/destroystokyo/paper/Metrics.java +++ b/src/main/java/com/destroystokyo/paper/Metrics.java @@ -933,6 +933,46 @@ public class Metrics { metrics.addCustomChart(new Metrics.DrilldownPie("gale_semantic_version", () -> semanticVersionMap)); // Gale end - semantic version - include in metrics + // Gale start - SIMD support - include in metrics + Map> simdSupportMap = new HashMap<>(2); // Empty until initialized + metrics.addCustomChart(new Metrics.DrilldownPie("simd_support", () -> { + if (!gg.pufferfish.pufferfish.simd.SIMDDetection.isInitialized()) { + return null; + } + if (simdSupportMap.isEmpty()) { + // Initialize + boolean isEnabled = gg.pufferfish.pufferfish.simd.SIMDDetection.isEnabled(); + + // use details as lower dimension + Map entry = new HashMap<>(2); + String details; + if (isEnabled) { + details = "int " + gg.pufferfish.pufferfish.simd.SIMDDetection.intVectorBitSize() + "*" + gg.pufferfish.pufferfish.simd.SIMDDetection.intElementSize() + ", float " + gg.pufferfish.pufferfish.simd.SIMDDetection.floatVectorBitSize() + "*" + gg.pufferfish.pufferfish.simd.SIMDDetection.floatElementSize(); + } else { + if (!gg.pufferfish.pufferfish.simd.SIMDDetection.supportingJavaVersion()) { + details = "unsupported Java"; + try { + var javaVersion = gg.pufferfish.pufferfish.simd.SIMDDetection.getJavaVersion(); + details += " (" + javaVersion + ")"; + } catch (Throwable ignored) {} + } else if (!gg.pufferfish.pufferfish.simd.SIMDDetection.testRunCompleted()) { + details = "test failed"; + } else if (gg.pufferfish.pufferfish.simd.SIMDDetection.unsupportingLaneSize()) { + details = "no supporting lane size"; + } else { + details = "other reason"; + } + } + entry.put(details, 1); + + // use enabled or not as higher dimension + simdSupportMap.put(String.valueOf(isEnabled), entry); + + } + return simdSupportMap; + })); + // Gale end - SIMD support - include in metrics + } } diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java index e75f0e6ce6cb7fa88ca3bd8dd7e63ea885bae341..aba9c02f74bc0a1270d90a17db74f64dadb99f92 100644 --- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java +++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java @@ -14,6 +14,8 @@ import java.util.Locale; import java.util.Optional; import java.util.function.BooleanSupplier; import javax.annotation.Nullable; + +import gg.pufferfish.pufferfish.simd.SIMDDetection; import net.minecraft.DefaultUncaughtExceptionHandler; import net.minecraft.DefaultUncaughtExceptionHandlerWithName; import net.minecraft.SharedConstants; @@ -46,6 +48,7 @@ import net.minecraft.world.level.GameType; import net.minecraft.world.level.block.entity.SkullBlockEntity; import net.minecraft.world.level.storage.LevelStorageSource; import org.galemc.gale.command.GaleCommands; +import org.galemc.gale.configuration.GaleGlobalConfiguration; import org.slf4j.Logger; // CraftBukkit start @@ -223,6 +226,13 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface io.papermc.paper.brigadier.PaperBrigadierProviderImpl.INSTANCE.getClass(); // init PaperBrigadierProvider // Paper end + // Gale start - Pufferfish - SIMD support + // Initialize vectorization + try { + SIMDDetection.initialize(); + } catch (Throwable ignored) {} + // Gale start - Pufferfish - SIMD support + this.setPvpAllowed(dedicatedserverproperties.pvp); this.setFlightAllowed(dedicatedserverproperties.allowFlight); this.setMotd(dedicatedserverproperties.motd); diff --git a/src/main/java/org/galemc/gale/configuration/GaleGlobalConfiguration.java b/src/main/java/org/galemc/gale/configuration/GaleGlobalConfiguration.java index 2a3cd1baab364126d10a42c8ab59f3da8ca9bdfb..5ade5d2ff3a68cf9e0240fc86e4b63432cb899c0 100644 --- a/src/main/java/org/galemc/gale/configuration/GaleGlobalConfiguration.java +++ b/src/main/java/org/galemc/gale/configuration/GaleGlobalConfiguration.java @@ -25,6 +25,14 @@ public class GaleGlobalConfiguration extends ConfigurationPart { public int dummyValue = 0; + // Gale start - Pufferfish - SIMD support + public Simd simd; + public class Simd extends ConfigurationPart { + public boolean warnIfDisabled = true; + public boolean logVectorSizesToConsole = false; + } + // Gale end - Pufferfish - SIMD support + } public Misc misc;