From d0a354a411b6b5cd6ac6ef1573a7c8f5e8a9b394 Mon Sep 17 00:00:00 2001 From: falkTX Date: Sat, 31 Dec 2022 18:01:22 +0000 Subject: [PATCH] Set up aggressive optimizations when using simde or MOD Signed-off-by: falkTX --- include/simd-compat/emmintrin.h | 6 ++++++ include/simd-compat/immintrin.h | 6 ++++++ include/simd-compat/mmintrin.h | 6 ++++++ include/simd-compat/pmmintrin.h | 6 ++++++ include/simd-compat/xmmintrin.h | 6 ++++++ plugins/Cardinal/src/HostAudio.cpp | 6 ++++++ plugins/Cardinal/src/HostCV.cpp | 8 ++++++++ src/CardinalPlugin.cpp | 2 +- src/Makefile | 4 ++++ src/Makefile.cardinal.mk | 4 ++-- src/override/Engine.cpp | 8 +++----- 11 files changed, 54 insertions(+), 8 deletions(-) diff --git a/include/simd-compat/emmintrin.h b/include/simd-compat/emmintrin.h index 1ac1027..f3f798b 100644 --- a/include/simd-compat/emmintrin.h +++ b/include/simd-compat/emmintrin.h @@ -20,6 +20,12 @@ #if (defined(__i386__) || defined(__x86_64__) || defined(__EMSCRIPTEN__)) && !defined(CARDINAL_NOSIMD) # include_next #else +# define SIMDE_ACCURACY_PREFERENCE 0 # define SIMDE_ENABLE_NATIVE_ALIASES +# define SIMDE_FAST_CONVERSION_RANGE +# define SIMDE_FAST_MATH +# define SIMDE_FAST_NANS +# define SIMDE_FAST_ROUND_MODE +# define SIMDE_FAST_ROUND_TIES # include "../simde/simde/x86/sse.h" #endif diff --git a/include/simd-compat/immintrin.h b/include/simd-compat/immintrin.h index 3d18624..20fe5e4 100644 --- a/include/simd-compat/immintrin.h +++ b/include/simd-compat/immintrin.h @@ -20,7 +20,13 @@ #if (defined(__i386__) || defined(__x86_64__) || defined(__EMSCRIPTEN__)) && !defined(CARDINAL_NOSIMD) # include_next #else +# define SIMDE_ACCURACY_PREFERENCE 0 # define SIMDE_ENABLE_NATIVE_ALIASES +# define SIMDE_FAST_CONVERSION_RANGE +# define SIMDE_FAST_MATH +# define SIMDE_FAST_NANS +# define SIMDE_FAST_ROUND_MODE +# define SIMDE_FAST_ROUND_TIES # include "../simde/simde/x86/sse.h" # include "../simde/simde/x86/sse2.h" #endif diff --git a/include/simd-compat/mmintrin.h b/include/simd-compat/mmintrin.h index 7ee7529..92d9b45 100644 --- a/include/simd-compat/mmintrin.h +++ b/include/simd-compat/mmintrin.h @@ -22,6 +22,12 @@ #elif defined(__EMSCRIPTEN__) && !defined(CARDINAL_NOSIMD) # include #else +# define SIMDE_ACCURACY_PREFERENCE 0 # define SIMDE_ENABLE_NATIVE_ALIASES +# define SIMDE_FAST_CONVERSION_RANGE +# define SIMDE_FAST_MATH +# define SIMDE_FAST_NANS +# define SIMDE_FAST_ROUND_MODE +# define SIMDE_FAST_ROUND_TIES # include "../simde/simde/x86/mmx.h" #endif diff --git a/include/simd-compat/pmmintrin.h b/include/simd-compat/pmmintrin.h index 3c35e0b..3fd9afc 100644 --- a/include/simd-compat/pmmintrin.h +++ b/include/simd-compat/pmmintrin.h @@ -67,7 +67,13 @@ __m64 _mm_set1_pi16(short w) */ #else +# define SIMDE_ACCURACY_PREFERENCE 0 # define SIMDE_ENABLE_NATIVE_ALIASES +# define SIMDE_FAST_CONVERSION_RANGE +# define SIMDE_FAST_MATH +# define SIMDE_FAST_NANS +# define SIMDE_FAST_ROUND_MODE +# define SIMDE_FAST_ROUND_TIES # include "../simde/simde/x86/sse.h" # include "../simde/simde/x86/sse2.h" # include "../simde/simde/x86/sse3.h" diff --git a/include/simd-compat/xmmintrin.h b/include/simd-compat/xmmintrin.h index 362a9da..9a860e5 100644 --- a/include/simd-compat/xmmintrin.h +++ b/include/simd-compat/xmmintrin.h @@ -20,6 +20,12 @@ #if (defined(__i386__) || defined(__x86_64__) || defined(__EMSCRIPTEN__)) && !defined(CARDINAL_NOSIMD) # include_next #else +# define SIMDE_ACCURACY_PREFERENCE 0 # define SIMDE_ENABLE_NATIVE_ALIASES +# define SIMDE_FAST_CONVERSION_RANGE +# define SIMDE_FAST_MATH +# define SIMDE_FAST_NANS +# define SIMDE_FAST_ROUND_MODE +# define SIMDE_FAST_ROUND_TIES # include "../simde/simde/x86/avx.h" #endif diff --git a/plugins/Cardinal/src/HostAudio.cpp b/plugins/Cardinal/src/HostAudio.cpp index acaf610..09c7949 100644 --- a/plugins/Cardinal/src/HostAudio.cpp +++ b/plugins/Cardinal/src/HostAudio.cpp @@ -182,6 +182,9 @@ struct HostAudio2 : HostAudio<2> { if (in1connected) { + if (!std::isfinite(dataOuts[0][k])) + __builtin_unreachable(); + valueL = inputs[0].getVoltageSum() * 0.1f; if (dcFilterEnabled) @@ -200,6 +203,9 @@ struct HostAudio2 : HostAudio<2> { if (in2connected) { + if (!std::isfinite(dataOuts[1][k])) + __builtin_unreachable(); + valueR = inputs[1].getVoltageSum() * 0.1f; if (dcFilterEnabled) diff --git a/plugins/Cardinal/src/HostCV.cpp b/plugins/Cardinal/src/HostCV.cpp index be9c110..fee8aec 100644 --- a/plugins/Cardinal/src/HostCV.cpp +++ b/plugins/Cardinal/src/HostCV.cpp @@ -146,14 +146,22 @@ struct HostCV : TerminalModule { inputOffset = params[BIPOLAR_INPUTS_1_5].getValue() > 0.1f ? 5.0f : 0.0f; for (int i=0; i<5; ++i) + { + if (!std::isfinite(dataOuts[i+ioOffset][k])) + __builtin_unreachable(); dataOuts[i+ioOffset][k] += inputs[i].getVoltage() + inputOffset; + } if (pcontext->variant == kCardinalVariantMain) { inputOffset = params[BIPOLAR_INPUTS_6_10].getValue() > 0.1f ? 5.0f : 0.0f; for (int i=5; i<10; ++i) + { + if (!std::isfinite(dataOuts[i+ioOffset][k])) + __builtin_unreachable(); dataOuts[i+ioOffset][k] += inputs[i].getVoltage() + inputOffset; + } } } }; diff --git a/src/CardinalPlugin.cpp b/src/CardinalPlugin.cpp index bcf760d..413ced9 100644 --- a/src/CardinalPlugin.cpp +++ b/src/CardinalPlugin.cpp @@ -924,7 +924,7 @@ protected: json_object_set_new(moduleJ, "favorite", json_boolean(m.favorite)); if (m.added > 0) json_object_set_new(moduleJ, "added", json_integer(m.added)); - if (std::isfinite(m.lastAdded)) + if (std::isfinite(m.lastAdded) && d_isNotZero(m.lastAdded)) json_object_set_new(moduleJ, "lastAdded", json_real(m.lastAdded)); if (json_object_size(moduleJ)) diff --git a/src/Makefile b/src/Makefile index 7d73a0f..2654df4 100644 --- a/src/Makefile +++ b/src/Makefile @@ -104,6 +104,10 @@ ifeq ($(HAIKU),true) BASE_FLAGS += -DCLOCK_MONOTONIC_RAW=CLOCK_MONOTONIC endif +ifeq ($(MOD_BUILD),true) +BASE_FLAGS += -DSIMDE_ENABLE_OPENMP -fopenmp +endif + ifneq ($(WASM),true) ifneq ($(HAIKU),true) BASE_FLAGS += -pthread diff --git a/src/Makefile.cardinal.mk b/src/Makefile.cardinal.mk index 42e9423..f646d26 100644 --- a/src/Makefile.cardinal.mk +++ b/src/Makefile.cardinal.mk @@ -323,6 +323,8 @@ BASE_FLAGS += -DDISTRHO_PLUGIN_USES_CUSTOM_MODGUI=0 else BASE_FLAGS += -DDISTRHO_PLUGIN_USES_CUSTOM_MODGUI=1 endif +BASE_FLAGS += -DSIMDE_ENABLE_OPENMP -fopenmp +LINK_FLAGS += -fopenmp endif ifneq ($(WASM),true) @@ -346,8 +348,6 @@ BASE_FLAGS += -DNANOVG_GLES3_FORCED endif BUILD_C_FLAGS += -std=gnu11 -BUILD_C_FLAGS += -fno-finite-math-only -fno-strict-aliasing -BUILD_CXX_FLAGS += -fno-finite-math-only -fno-strict-aliasing ifneq ($(MACOS),true) BUILD_CXX_FLAGS += -faligned-new -Wno-abi diff --git a/src/override/Engine.cpp b/src/override/Engine.cpp index c0b03a1..4145670 100644 --- a/src/override/Engine.cpp +++ b/src/override/Engine.cpp @@ -140,11 +140,9 @@ static void Cable_step(Cable* that) { const int channels = output->channels; // Copy all voltages from output to input for (int c = 0; c < channels; c++) { - float v = output->voltages[c]; - // Set 0V if infinite or NaN - if (!std::isfinite(v)) - v = 0.f; - input->voltages[c] = v; + if (!std::isfinite(output->voltages[c])) + __builtin_unreachable(); + input->voltages[c] = output->voltages[c]; } // Set higher channel voltages to 0 for (int c = channels; c < input->channels; c++) {