From 446458d20cecd81fff91372a59f2e3666d20590a Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Thu, 8 Jul 2021 00:25:49 +0200 Subject: [PATCH] Add `PLATFORM_THREADS_LIMIT` for maximum concurrency limiting --- Source/Engine/Animations/Graph/AnimGraph.cpp | 2 +- Source/Engine/Animations/Graph/AnimGraph.h | 2 +- Source/Engine/Content/Assets/VisualScript.cpp | 2 +- Source/Engine/Core/Collections/Sorting.cpp | 2 +- .../Particles/Graph/CPU/ParticleEmitterGraph.CPU.cpp | 2 +- .../Engine/Particles/Graph/CPU/ParticleEmitterGraph.CPU.h | 2 +- Source/Engine/Platform/Defines.h | 3 +++ Source/Engine/Scripting/Scripting.cpp | 2 +- Source/Engine/Scripting/Scripting.h | 2 +- Source/Engine/Threading/JobSystem.cpp | 2 +- Source/Engine/Threading/ThreadLocal.h | 8 +++----- Source/Engine/Threading/ThreadPool.cpp | 2 +- 12 files changed, 16 insertions(+), 15 deletions(-) diff --git a/Source/Engine/Animations/Graph/AnimGraph.cpp b/Source/Engine/Animations/Graph/AnimGraph.cpp index e726fbacc..128e29e59 100644 --- a/Source/Engine/Animations/Graph/AnimGraph.cpp +++ b/Source/Engine/Animations/Graph/AnimGraph.cpp @@ -6,7 +6,7 @@ #include "Engine/Graphics/Models/SkeletonData.h" #include "Engine/Scripting/Scripting.h" -ThreadLocal AnimGraphExecutor::Context; +ThreadLocal AnimGraphExecutor::Context; RootMotionData RootMotionData::Identity = { Vector3(0.0f), Quaternion(0.0f, 0.0f, 0.0f, 1.0f) }; diff --git a/Source/Engine/Animations/Graph/AnimGraph.h b/Source/Engine/Animations/Graph/AnimGraph.h index 1e011aed3..d9c750cc8 100644 --- a/Source/Engine/Animations/Graph/AnimGraph.h +++ b/Source/Engine/Animations/Graph/AnimGraph.h @@ -790,7 +790,7 @@ private: int32 _skeletonNodesCount = 0; // Per-thread context to allow async execution - static ThreadLocal Context; + static ThreadLocal Context; public: diff --git a/Source/Engine/Content/Assets/VisualScript.cpp b/Source/Engine/Content/Assets/VisualScript.cpp index 0d523b67f..85f4c3c4a 100644 --- a/Source/Engine/Content/Assets/VisualScript.cpp +++ b/Source/Engine/Content/Assets/VisualScript.cpp @@ -30,7 +30,7 @@ namespace VisualScripting::StackFrame* Stack; }; - ThreadLocal ThreadStacks; + ThreadLocal ThreadStacks; VisualScriptingBinaryModule VisualScriptingModule; VisualScriptExecutor VisualScriptingExecutor; diff --git a/Source/Engine/Core/Collections/Sorting.cpp b/Source/Engine/Core/Collections/Sorting.cpp index 4b2f2021e..4ee1d8658 100644 --- a/Source/Engine/Core/Collections/Sorting.cpp +++ b/Source/Engine/Core/Collections/Sorting.cpp @@ -4,7 +4,7 @@ #include "Engine/Threading/ThreadLocal.h" // Use a cached storage for the sorting (one per thread to reduce locking) -ThreadLocal SortingStacks; +ThreadLocal SortingStacks; Sorting::SortingStack& Sorting::SortingStack::Get() { diff --git a/Source/Engine/Particles/Graph/CPU/ParticleEmitterGraph.CPU.cpp b/Source/Engine/Particles/Graph/CPU/ParticleEmitterGraph.CPU.cpp index 396cbaee0..0de97633b 100644 --- a/Source/Engine/Particles/Graph/CPU/ParticleEmitterGraph.CPU.cpp +++ b/Source/Engine/Particles/Graph/CPU/ParticleEmitterGraph.CPU.cpp @@ -7,7 +7,7 @@ #include "Engine/Particles/ParticleEffect.h" #include "Engine/Engine/Time.h" -ThreadLocal ParticleEmitterGraphCPUExecutor::Context; +ThreadLocal ParticleEmitterGraphCPUExecutor::Context; namespace { diff --git a/Source/Engine/Particles/Graph/CPU/ParticleEmitterGraph.CPU.h b/Source/Engine/Particles/Graph/CPU/ParticleEmitterGraph.CPU.h index 587999aae..34834a2cd 100644 --- a/Source/Engine/Particles/Graph/CPU/ParticleEmitterGraph.CPU.h +++ b/Source/Engine/Particles/Graph/CPU/ParticleEmitterGraph.CPU.h @@ -134,7 +134,7 @@ private: ParticleEmitterGraphCPU& _graph; // Per-thread context to allow async execution - static ThreadLocal Context; + static ThreadLocal Context; public: diff --git a/Source/Engine/Platform/Defines.h b/Source/Engine/Platform/Defines.h index 9064fb13a..a5b23446f 100644 --- a/Source/Engine/Platform/Defines.h +++ b/Source/Engine/Platform/Defines.h @@ -168,6 +168,9 @@ API_ENUM() enum class ArchitectureType #ifndef PLATFORM_LINE_TERMINATOR #define PLATFORM_LINE_TERMINATOR "\n" #endif +#ifndef PLATFORM_THREADS_LIMIT +#define PLATFORM_THREADS_LIMIT 64 +#endif #define PLATFORM_32BITS (!PLATFORM_64BITS) // Platform family defines diff --git a/Source/Engine/Scripting/Scripting.cpp b/Source/Engine/Scripting/Scripting.cpp index 7744af2f3..4a965b62d 100644 --- a/Source/Engine/Scripting/Scripting.cpp +++ b/Source/Engine/Scripting/Scripting.cpp @@ -112,7 +112,7 @@ Action Scripting::ScriptsLoaded; Action Scripting::ScriptsUnload; Action Scripting::ScriptsReloading; Action Scripting::ScriptsReloaded; -ThreadLocal Scripting::ObjectsLookupIdMapping; +ThreadLocal Scripting::ObjectsLookupIdMapping; ScriptingService ScriptingServiceInstance; bool initFlaxEngine(); diff --git a/Source/Engine/Scripting/Scripting.h b/Source/Engine/Scripting/Scripting.h index fcdd3746c..d8d7502dc 100644 --- a/Source/Engine/Scripting/Scripting.h +++ b/Source/Engine/Scripting/Scripting.h @@ -116,7 +116,7 @@ public: /// /// The objects lookup identifier mapping used to override the object ids on FindObject call (used by the object references deserialization). /// - static ThreadLocal ObjectsLookupIdMapping; + static ThreadLocal ObjectsLookupIdMapping; /// /// Finds the object by the given identifier. Searches registered scene objects and optionally assets. Logs warning if fails. diff --git a/Source/Engine/Threading/JobSystem.cpp b/Source/Engine/Threading/JobSystem.cpp index c89afed8f..7b6651952 100644 --- a/Source/Engine/Threading/JobSystem.cpp +++ b/Source/Engine/Threading/JobSystem.cpp @@ -85,7 +85,7 @@ public: namespace { JobSystemService JobSystemInstance; - Thread* Threads[32] = {}; + Thread* Threads[PLATFORM_THREADS_LIMIT] = {}; int32 ThreadsCount = 0; bool JobStartingOnDispatch = true; volatile int64 ExitFlag = 0; diff --git a/Source/Engine/Threading/ThreadLocal.h b/Source/Engine/Threading/ThreadLocal.h index 8f15b443d..1b4de4e96 100644 --- a/Source/Engine/Threading/ThreadLocal.h +++ b/Source/Engine/Threading/ThreadLocal.h @@ -5,16 +5,14 @@ #include "Engine/Core/Types/BaseTypes.h" #include "Engine/Core/Collections/Array.h" #include "Threading.h" - -// Maximum amount of threads with an access to the thread local variable (we use static limit due to engine threading design) -#define THREAD_LOCAL_MAX_CAPACITY 16 +#include "Engine/Platform/Platform.h" /// /// Per-thread local variable storage. /// Implemented using atomic with per-thread storage indexed via thread id hashing. /// ForConsider using 'THREADLOCAL' define before the variable instead. /// -template +template class ThreadLocal { protected: @@ -104,7 +102,7 @@ protected: /// /// Per thread local object /// -template +template class ThreadLocalObject : public ThreadLocal { public: diff --git a/Source/Engine/Threading/ThreadPool.cpp b/Source/Engine/Threading/ThreadPool.cpp index f16e5c2a3..a9926f47e 100644 --- a/Source/Engine/Threading/ThreadPool.cpp +++ b/Source/Engine/Threading/ThreadPool.cpp @@ -51,7 +51,7 @@ ThreadPoolService ThreadPoolServiceInstance; bool ThreadPoolService::Init() { // Spawn threads - const int32 numThreads = Math::Max(2, Platform::GetCPUInfo().ProcessorCoreCount - 1); + const int32 numThreads = Math::Clamp(Platform::GetCPUInfo().ProcessorCoreCount - 1, 2, PLATFORM_THREADS_LIMIT); LOG(Info, "Spawning {0} Thread Pool workers", numThreads); for (int32 i = ThreadPoolImpl::Threads.Count(); i < numThreads; i++) {