From d35d91de05ac0b38e731e98bc31436ab89042203 Mon Sep 17 00:00:00 2001 From: Andrew Belt Date: Sat, 26 Jan 2019 13:32:40 -0500 Subject: [PATCH] Make engine multithreaded with OpenMP --- Makefile | 2 ++ include/engine/Engine.hpp | 1 + src/engine/Engine.cpp | 19 ++++++++++++++++++- 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 25c1d3f3..fc799bf9 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,8 @@ VERSION = 1.dev FLAGS += -DVERSION=$(VERSION) FLAGS += -Iinclude FLAGS += -Idep/include -Idep/lib/libzip/include +FLAGS += -fopenmp +LDFLAGS += -fopenmp include arch.mk diff --git a/include/engine/Engine.hpp b/include/engine/Engine.hpp index 52a6090d..e674c5b7 100644 --- a/include/engine/Engine.hpp +++ b/include/engine/Engine.hpp @@ -15,6 +15,7 @@ struct Engine { std::vector modules; std::vector cables; bool paused = false; + int threadCount; struct Internal; Internal *internal; diff --git a/src/engine/Engine.cpp b/src/engine/Engine.cpp index bdc38c8a..7e3b32e3 100644 --- a/src/engine/Engine.cpp +++ b/src/engine/Engine.cpp @@ -1,11 +1,13 @@ #include "engine/Engine.hpp" #include "settings.hpp" +#include "system.hpp" #include #include #include #include #include +#include #include #include @@ -71,6 +73,8 @@ Engine::Engine() { internal->sampleRate = sampleRate; internal->sampleTime = 1 / sampleRate; internal->sampleRateRequested = sampleRate; + + threadCount = 1; } Engine::~Engine() { @@ -116,7 +120,10 @@ static void Engine_step(Engine *engine) { float cpuLambda = engine->internal->sampleTime / 2.f; // Iterate modules - for (Module *module : engine->modules) { + int modulesLen = engine->modules.size(); + #pragma omp parallel for num_threads(engine->threadCount) schedule(dynamic) + for (int i = 0; i < modulesLen; i++) { + Module *module = engine->modules[i]; if (!module->bypass) { // Step module if (settings::powerMeter) { @@ -150,6 +157,10 @@ static void Engine_step(Engine *engine) { } static void Engine_run(Engine *engine) { +#if defined ARCH_LIN + // Name thread + system::setThreadName("Engine"); +#endif // Set CPU to flush-to-zero (FTZ) and denormals-are-zero (DAZ) mode // https://software.intel.com/en-us/node/682949 _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON); @@ -166,9 +177,15 @@ static void Engine_run(Engine *engine) { if (!engine->paused) { std::lock_guard lock(engine->internal->mutex); + // auto startTime = std::chrono::high_resolution_clock::now(); + for (int i = 0; i < mutexSteps; i++) { Engine_step(engine); } + + // auto stopTime = std::chrono::high_resolution_clock::now(); + // float cpuTime = std::chrono::duration(stopTime - startTime).count(); + // DEBUG("%g", cpuTime / mutexSteps * 44100); } double stepTime = mutexSteps * engine->internal->sampleTime;