wip(assembler): round L4 -- lazy per-thread caches: 17.3 MiB -> 43 KiB per thread, view 7% faster
VoxelForgeCoreThreadLocal::FLazy<T> (new public header ThreadLocalStorage.h) makes every large thread_local cache a pointer that heap-allocates on that thread's first use (still worker-private, lock-free). Static TLS 17.33 MiB -> 43 KiB (initialised image 5.8 MiB -> 21 KiB); worker start 5.2 -> 0.12 ms; idle worker RSS 17.7 MiB -> 52 KiB. Linux workers back to 8 MiB stacks. World unchanged (L1 hashes Clang off/GCC default, W1/W12; FloatingIslands seed 0). Reviewer interleaved W12: 2.256 -> 2.091 s. MSVC/UBT not compiled here. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ED33VnqepD4YY6gDAAA832
This commit is contained in:
1 parent
046f2af495
commit
7770074503
15 files changed
+361
-48
No files matched your search
@@ -1,5 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include "VoxelForgeCore/ThreadLocalStorage.h"
|
||||
#include "Json.h"
|
||||
#include "VoxelForgeCore/VoxelForgeCore.h"
|
||||
|
||||
@@ -441,7 +442,9 @@ namespace floating_island_detail
|
||||
constexpr std::size_t Ways=4;
|
||||
constexpr std::size_t SetCount=2048;
|
||||
static_assert((SetCount&(SetCount-1))==0);
|
||||
static thread_local std::array<FIslandColumnCacheEntry,SetCount*Ways> Cache{};
|
||||
static thread_local VoxelForgeCoreThreadLocal::FLazy<
|
||||
std::array<FIslandColumnCacheEntry,SetCount*Ways>> Cache;
|
||||
auto& cache=Cache.Get();
|
||||
const std::int64_t SampleX=static_cast<std::int64_t>(x);
|
||||
const std::int64_t SampleY=static_cast<std::int64_t>(y);
|
||||
std::uint64_t IndexKey=island.stableId
|
||||
@@ -452,10 +455,10 @@ namespace floating_island_detail
|
||||
IndexKey*=0xff51afd7ed558ccdull;
|
||||
IndexKey^=IndexKey>>33;
|
||||
const std::size_t Base=static_cast<std::size_t>(IndexKey&(SetCount-1))*Ways;
|
||||
FIslandColumnCacheEntry* Replacement=&Cache[Base+((IndexKey>>11)&(Ways-1))];
|
||||
FIslandColumnCacheEntry* Replacement=&cache[Base+((IndexKey>>11)&(Ways-1))];
|
||||
for(std::size_t Way=0;Way<Ways;++Way)
|
||||
{
|
||||
FIslandColumnCacheEntry& Entry=Cache[Base+Way];
|
||||
FIslandColumnCacheEntry& Entry=cache[Base+Way];
|
||||
const bool bKeyMatches=Entry.bValid&&Entry.Seed==recipe.seed
|
||||
&&Entry.StableId==island.stableId
|
||||
&&Entry.SampleX==SampleX&&Entry.SampleY==SampleY
|
||||
@@ -559,11 +562,13 @@ namespace floating_island_detail
|
||||
// Mettre en cache les constantes par worker; la cle complete evite tout partage d'etat.
|
||||
constexpr std::size_t CacheSize=1024;
|
||||
static_assert((CacheSize&(CacheSize-1))==0);
|
||||
static thread_local std::array<FRootLobeCacheEntry,CacheSize> Cache{};
|
||||
static thread_local VoxelForgeCoreThreadLocal::FLazy<
|
||||
std::array<FRootLobeCacheEntry,CacheSize>> Cache;
|
||||
auto& cache=Cache.Get();
|
||||
const std::uint64_t IndexKey=island.stableId^(island.stableId>>33)
|
||||
^(static_cast<std::uint64_t>(recipe.seed)<<17)
|
||||
^(static_cast<std::uint64_t>(static_cast<std::uint32_t>(rootIndex))*0x9e3779b97f4a7c15ull);
|
||||
FRootLobeCacheEntry& Entry=Cache[static_cast<std::size_t>(IndexKey)&(CacheSize-1)];
|
||||
FRootLobeCacheEntry& Entry=cache[static_cast<std::size_t>(IndexKey)&(CacheSize-1)];
|
||||
const bool bKeyMatches=Entry.bValid&&Entry.Seed==recipe.seed
|
||||
&&Entry.StableId==island.stableId&&Entry.RootIndex==rootIndex
|
||||
&&Entry.GeometryVersion==recipe.geometryVersion
|
||||
|
||||
Reference in new issue
Block a user