From e8cb1686c3d54ed36f8b87a42fb59a5fe42407c8 Mon Sep 17 00:00:00 2001 From: Ari Vuollet Date: Sun, 3 Sep 2023 17:52:03 +0300 Subject: [PATCH] Add build setting for target CPU architecture in C++ compile environment --- Source/Engine/Platform/Defines.h | 9 +++++ .../Build/NativeCpp/CompileEnvironment.cs | 36 +++++++++++++++++++ .../Platforms/Apple/AppleToolchain.cs | 1 + .../Platforms/Unix/UnixToolchain.cs | 19 ++++++++++ .../Platforms/Windows/WindowsToolchainBase.cs | 20 +++++++++++ .../VisualStudio/VCProjectGenerator.cs | 24 +++++++++++-- 6 files changed, 107 insertions(+), 2 deletions(-) diff --git a/Source/Engine/Platform/Defines.h b/Source/Engine/Platform/Defines.h index 40b250983..7f79bba81 100644 --- a/Source/Engine/Platform/Defines.h +++ b/Source/Engine/Platform/Defines.h @@ -221,6 +221,15 @@ API_ENUM() enum class ArchitectureType #if defined(__SSE4_2__) #define PLATFORM_SIMD_SSE4_2 1 #endif +#if defined(__AVX__) +#define PLATFORM_SIMD_AVX 1 +#endif +#if defined(__AVX2__) +#define PLATFORM_SIMD_AVX2 1 +#endif +#if defined(__AVX512F__) && defined(__AVX512CD__) && defined(__AVX512BW__) && defined(__AVX512DQ__) && defined(__AVX512VL__) +#define PLATFORM_SIMD_AVX512 1 +#endif #endif #if defined(_M_ARM) || defined(__ARM_NEON__) || defined(__ARM_NEON) #define PLATFORM_SIMD_NEON 1 diff --git a/Source/Tools/Flax.Build/Build/NativeCpp/CompileEnvironment.cs b/Source/Tools/Flax.Build/Build/NativeCpp/CompileEnvironment.cs index eac85e17e..75427995c 100644 --- a/Source/Tools/Flax.Build/Build/NativeCpp/CompileEnvironment.cs +++ b/Source/Tools/Flax.Build/Build/NativeCpp/CompileEnvironment.cs @@ -84,6 +84,36 @@ namespace Flax.Build.NativeCpp Latest, } + /// + /// The CPU architecture / instruction set. + /// + public enum CpuArchitecture + { + /// + /// Default architecture (unspecified) + /// + Default, + + // X86-64 instruction sets: + + /// + /// AVX + /// + AVX, + + /// + /// AVX2 + /// + AVX2, + + /// + /// AVX512 + /// + AVX512, + + // TODO: Add other instruction sets for ARM and other platforms. + } + /// /// The C++ compilation environment required to build source files in the native modules. /// @@ -174,6 +204,11 @@ namespace Flax.Build.NativeCpp /// public bool IntrinsicFunctions = false; + /// + /// The minimum target CPU architecture. + /// + public CpuArchitecture Architecture = CpuArchitecture.Default; + /// /// Enables buffer security checks. /// @@ -236,6 +271,7 @@ namespace Flax.Build.NativeCpp RuntimeChecks = RuntimeChecks, StringPooling = StringPooling, IntrinsicFunctions = IntrinsicFunctions, + Architecture = Architecture, BufferSecurityCheck = BufferSecurityCheck, TreatWarningsAsErrors = TreatWarningsAsErrors, PrecompiledHeaderUsage = PrecompiledHeaderUsage, diff --git a/Source/Tools/Flax.Build/Platforms/Apple/AppleToolchain.cs b/Source/Tools/Flax.Build/Platforms/Apple/AppleToolchain.cs index 8461d6aac..7c002d23f 100644 --- a/Source/Tools/Flax.Build/Platforms/Apple/AppleToolchain.cs +++ b/Source/Tools/Flax.Build/Platforms/Apple/AppleToolchain.cs @@ -124,6 +124,7 @@ namespace Flax.Build.Platforms switch (Architecture) { case TargetArchitecture.x64: + // TODO: compileEnvironment.Architecture? commonArgs.Add("-msse2"); break; } diff --git a/Source/Tools/Flax.Build/Platforms/Unix/UnixToolchain.cs b/Source/Tools/Flax.Build/Platforms/Unix/UnixToolchain.cs index b03dcbb90..ace2a4b39 100644 --- a/Source/Tools/Flax.Build/Platforms/Unix/UnixToolchain.cs +++ b/Source/Tools/Flax.Build/Platforms/Unix/UnixToolchain.cs @@ -348,6 +348,25 @@ namespace Flax.Build.Platforms break; } + if (Architecture == TargetArchitecture.x86 || Architecture == TargetArchitecture.x64) + { + switch (compileEnvironment.Architecture) + { + case CpuArchitecture.Default: + //commonArgs.Add("-march=x86-64"); + break; + case CpuArchitecture.AVX: + commonArgs.Add("-march=sandybridge"); + break; + case CpuArchitecture.AVX2: + commonArgs.Add("-march=x86-64-v3"); + break; + case CpuArchitecture.AVX512: + commonArgs.Add("-march=x86-64-v4"); + break; + } + } + commonArgs.Add("-Wdelete-non-virtual-dtor"); commonArgs.Add("-fno-math-errno"); commonArgs.Add("-fdiagnostics-format=msvc"); diff --git a/Source/Tools/Flax.Build/Platforms/Windows/WindowsToolchainBase.cs b/Source/Tools/Flax.Build/Platforms/Windows/WindowsToolchainBase.cs index c1cdcb0ee..418938c9e 100644 --- a/Source/Tools/Flax.Build/Platforms/Windows/WindowsToolchainBase.cs +++ b/Source/Tools/Flax.Build/Platforms/Windows/WindowsToolchainBase.cs @@ -469,6 +469,26 @@ namespace Flax.Build.Platforms if (compileEnvironment.IntrinsicFunctions) commonArgs.Add("/Oi"); + // Minimum target architecture + if (Architecture == TargetArchitecture.x64) + { + switch (compileEnvironment.Architecture) + { + case CpuArchitecture.AVX: + commonArgs.Add("/arch:AVX"); + break; + case CpuArchitecture.AVX2: + commonArgs.Add("/arch:AVX2"); + break; + case CpuArchitecture.AVX512: + commonArgs.Add("/arch:AVX512"); + break; + case CpuArchitecture.Default: + default: + break; + } + } + // Enable Function-Level Linking if (compileEnvironment.FunctionLevelLinking) commonArgs.Add("/Gy"); diff --git a/Source/Tools/Flax.Build/Projects/VisualStudio/VCProjectGenerator.cs b/Source/Tools/Flax.Build/Projects/VisualStudio/VCProjectGenerator.cs index 13c728b30..b653c8d18 100644 --- a/Source/Tools/Flax.Build/Projects/VisualStudio/VCProjectGenerator.cs +++ b/Source/Tools/Flax.Build/Projects/VisualStudio/VCProjectGenerator.cs @@ -327,7 +327,7 @@ namespace Flax.Build.Projects.VisualStudio vcFiltersFileContent.AppendLine(" "); // IntelliSense information - + var additionalDefinitions = project.Defines.ToList(); var additionalOptions = new List(); switch (project.Configurations[0].TargetBuildOptions.CompileEnv.CppVersion) { @@ -345,8 +345,28 @@ namespace Flax.Build.Projects.VisualStudio break; } + switch (project.Configurations[0].TargetBuildOptions.CompileEnv.Architecture) + { + case CpuArchitecture.Default: + break; + case CpuArchitecture.AVX512: + additionalDefinitions.Add("__AVX512F__"); + additionalDefinitions.Add("__AVX512CD__"); + additionalDefinitions.Add("__AVX512BW__"); + additionalDefinitions.Add("__AVX512DQ__"); + additionalDefinitions.Add("__AVX512VL__"); + goto case CpuArchitecture.AVX2; + case CpuArchitecture.AVX2: + additionalDefinitions.Add("__AVX2__"); + goto case CpuArchitecture.AVX; + case CpuArchitecture.AVX: + additionalDefinitions.Add("__AVX__"); + break; + + } + vcProjectFileContent.AppendLine(" "); - vcProjectFileContent.AppendLine(string.Format(" $(NMakePreprocessorDefinitions){0}", (project.Defines.Count > 0 ? (";" + string.Join(";", project.Defines)) : ""))); + vcProjectFileContent.AppendLine(string.Format(" $(NMakePreprocessorDefinitions){0}", (additionalDefinitions.Count > 0 ? (";" + string.Join(";", additionalDefinitions)) : ""))); vcProjectFileContent.AppendLine(string.Format(" $(NMakeIncludeSearchPath){0}", (project.SearchPaths.Length > 0 ? (";" + string.Join(";", project.SearchPaths)) : ""))); vcProjectFileContent.AppendLine(" $(NMakeForcedIncludes)"); vcProjectFileContent.AppendLine(" $(NMakeAssemblySearchPath)");