From 174b038bf3b3b8a0d82422a861a050391a33f34a Mon Sep 17 00:00:00 2001 From: Tomasz Sobczyk Date: Sun, 27 Feb 2022 17:02:13 +0100 Subject: [PATCH] Use dynamic allocation for evaluation scratch TLS buffer. fixes #3946 an issue related with the toolchain as found in xcode 12 on macOS, related to previous commit 5f781d36. closes https://github.com/official-stockfish/Stockfish/pull/3950 No functional change --- src/nnue/nnue_architecture.h | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/nnue/nnue_architecture.h b/src/nnue/nnue_architecture.h index b4f65364..4f9596ae 100644 --- a/src/nnue/nnue_architecture.h +++ b/src/nnue/nnue_architecture.h @@ -21,6 +21,8 @@ #ifndef NNUE_ARCHITECTURE_H_INCLUDED #define NNUE_ARCHITECTURE_H_INCLUDED +#include + #include "nnue_common.h" #include "features/half_ka_v2_hm.h" @@ -88,9 +90,7 @@ struct Network std::int32_t propagate(const TransformedFeatureType* transformedFeatures) { - constexpr uint64_t alignment = CacheLineSize; - - struct Buffer + struct alignas(CacheLineSize) Buffer { alignas(CacheLineSize) decltype(fc_0)::OutputBuffer fc_0_out; alignas(CacheLineSize) decltype(ac_0)::OutputBuffer ac_0_out; @@ -104,12 +104,13 @@ struct Network } }; -#if defined(ALIGNAS_ON_STACK_VARIABLES_BROKEN) - static thread_local char bufferRaw[sizeof(Buffer) + alignment]; - static thread_local char* bufferRawAligned = align_ptr_up(&bufferRaw[0]); - static thread_local Buffer& buffer = *(new (bufferRawAligned) Buffer); +#if defined(__clang__) && (__APPLE__) + // workaround for a bug reported with xcode 12 + static thread_local auto tlsBuffer = std::make_unique(); + // Access TLS only once, cache result. + Buffer& buffer = *tlsBuffer; #else - alignas(alignment) static thread_local Buffer buffer; + alignas(CacheLineSize) static thread_local Buffer buffer; #endif fc_0.propagate(transformedFeatures, buffer.fc_0_out); -- 2.39.2