diff --git a/src/Makefile b/src/Makefile index b989defd..91290bdc 100644 --- a/src/Makefile +++ b/src/Makefile @@ -363,8 +363,8 @@ endif endif ifeq ($(KERNEL),Darwin) - CXXFLAGS += -arch $(arch) -mmacosx-version-min=10.9 - LDFLAGS += -arch $(arch) -mmacosx-version-min=10.9 + CXXFLAGS += -arch $(arch) -mmacosx-version-min=10.15 + LDFLAGS += -arch $(arch) -mmacosx-version-min=10.15 endif ### Travis CI script uses COMPILER to overwrite CXX diff --git a/src/misc.cpp b/src/misc.cpp index 1a102a50..393552cc 100644 --- a/src/misc.cpp +++ b/src/misc.cpp @@ -46,6 +46,7 @@ typedef bool(*fun3_t)(HANDLE, CONST GROUP_AFFINITY*, PGROUP_AFFINITY); #include #include #include +#include #if defined(__linux__) && !defined(__ANDROID__) #include @@ -293,6 +294,29 @@ void prefetch(void* addr) { #endif +/// Wrappers for systems where the c++17 implementation doesn't guarantee the availability of aligned_alloc. +/// Memory allocated with std_aligned_alloc must be freed with std_aligned_free. +/// + +void* std_aligned_alloc(size_t alignment, size_t size) { +#if defined(__APPLE__) + return aligned_alloc(alignment, size); +#elif defined(_MSC_VER) + return _aligned_alloc(size, alignment); +#else + return std::aligned_alloc(alignment, size); +#endif +} + +void std_aligned_free(void* ptr) { +#if defined(__APPLE__) + free(ptr); +#elif defined(_MSC_VER) + _aligned_free(ptr); +#else + free(ptr); +#endif +} /// aligned_ttmem_alloc() will return suitably aligned memory, and if possible use large pages. /// The returned pointer is the aligned one, while the mem argument is the one that needs diff --git a/src/misc.h b/src/misc.h index 373f1b77..dca3789c 100644 --- a/src/misc.h +++ b/src/misc.h @@ -33,6 +33,8 @@ const std::string engine_info(bool to_uci = false); const std::string compiler_info(); void prefetch(void* addr); void start_logger(const std::string& fname); +void* std_aligned_alloc(size_t alignment, size_t size); +void std_aligned_free(void* ptr); void* aligned_ttmem_alloc(size_t size, void*& mem); void aligned_ttmem_free(void* mem); // nop if mem == nullptr diff --git a/src/nnue/evaluate_nnue.cpp b/src/nnue/evaluate_nnue.cpp index a3f49b87..8807f3e8 100644 --- a/src/nnue/evaluate_nnue.cpp +++ b/src/nnue/evaluate_nnue.cpp @@ -57,7 +57,7 @@ namespace Eval::NNUE { template void Initialize(AlignedPtr& pointer) { - pointer.reset(reinterpret_cast(std::aligned_alloc(alignof(T), sizeof(T)))); + pointer.reset(reinterpret_cast(std_aligned_alloc(alignof(T), sizeof(T)))); std::memset(pointer.get(), 0, sizeof(T)); } diff --git a/src/nnue/evaluate_nnue.h b/src/nnue/evaluate_nnue.h index 1e13aa2c..3368df67 100644 --- a/src/nnue/evaluate_nnue.h +++ b/src/nnue/evaluate_nnue.h @@ -5,6 +5,7 @@ #include "nnue_feature_transformer.h" #include "nnue_architecture.h" +#include "../misc.h" #include @@ -19,7 +20,7 @@ namespace Eval::NNUE { struct AlignedDeleter { void operator()(T* ptr) const { ptr->~T(); - std::free(ptr); + std_aligned_free(ptr); } };