From dcd6f6d60df3bbf9ff2ecae3914b627395139cd6 Mon Sep 17 00:00:00 2001 From: Joachim Schoeberl Date: Wed, 8 Jan 2025 08:25:12 +0100 Subject: [PATCH] TablePrefixSum 32/64 bit decision --- libsrc/core/table.cpp | 4 ++-- libsrc/core/table.hpp | 14 ++++++++++++++ libsrc/meshing/meshtype.hpp | 9 ++++++++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/libsrc/core/table.cpp b/libsrc/core/table.cpp index 1fbcda75..b71cb615 100644 --- a/libsrc/core/table.cpp +++ b/libsrc/core/table.cpp @@ -62,9 +62,9 @@ namespace ngcore return index; } - NGCORE_API size_t * TablePrefixSum32 (FlatArray entrysize) + NGCORE_API size_t * TablePrefixSum32 (FlatArray entrysize) { return TablePrefixSum2 (entrysize); } - NGCORE_API size_t * TablePrefixSum64 (FlatArray entrysize) + NGCORE_API size_t * TablePrefixSum64 (FlatArray entrysize) { return TablePrefixSum2 (entrysize); } /* diff --git a/libsrc/core/table.hpp b/libsrc/core/table.hpp index d2326c26..f7ba47ea 100644 --- a/libsrc/core/table.hpp +++ b/libsrc/core/table.hpp @@ -94,6 +94,7 @@ namespace ngcore Iterator end() const { return Iterator(*this, BASE+size); } }; + /* NGCORE_API extern size_t * TablePrefixSum32 (FlatArray entrysize); NGCORE_API extern size_t * TablePrefixSum64 (FlatArray entrysize); @@ -106,7 +107,20 @@ namespace ngcore { return TablePrefixSum32 (FlatArray (entrysize.Size(), (unsigned int*)(std::atomic*)entrysize.Addr(0))); } NETGEN_INLINE size_t * TablePrefixSum (FlatArray entrysize) { return TablePrefixSum64 (entrysize); } + */ + NGCORE_API extern size_t * TablePrefixSum32 (FlatArray entrysize); + NGCORE_API extern size_t * TablePrefixSum64 (FlatArray entrysize); + + template // TODO: enable_if T is integral + NETGEN_INLINE size_t * TablePrefixSum (FlatArray entrysize) + { + if constexpr (sizeof(T) == 4) + return TablePrefixSum32 ( { entrysize.Size(), (uint32_t*)(void*)entrysize.Addr(0) }); + else + return TablePrefixSum64 ( { entrysize.Size(), (uint64_t*)(void*)entrysize.Addr(0) }); + } + /** A compact Table container. diff --git a/libsrc/meshing/meshtype.hpp b/libsrc/meshing/meshtype.hpp index 619b3e41..27597581 100644 --- a/libsrc/meshing/meshtype.hpp +++ b/libsrc/meshing/meshtype.hpp @@ -138,6 +138,8 @@ namespace netgen class t_invalid { public: constexpr t_invalid() = default; }; static constexpr t_invalid INVALID{}; + + typedef decltype( declval()-declval() ) T_diff; public: constexpr Index () = default; @@ -182,11 +184,16 @@ namespace netgen TIndex operator-- (int) { TIndex hi(*this); i--; return hi; } TIndex & operator++ () { i++; return static_cast(*this); } TIndex & operator-- () { i--; return static_cast(*this); } + + /* constexpr TIndex operator+= (int add) { i += add; return TIndex{*this}; } constexpr TIndex operator+= (size_t add) { i += add; return TIndex{*this}; } constexpr TIndex operator-= (int add) { i -= add; return TIndex{*this}; } constexpr TIndex operator-= (size_t add) { i -= add; return TIndex{*this}; } - + */ + constexpr TIndex operator+= (T_diff add) { i += add; return TIndex{*this}; } + constexpr TIndex operator-= (T_diff add) { i -= add; return TIndex{*this}; } + constexpr auto operator- (Index i2) const { return i-i2.i; } // bool operator== (Index i2) const { return i==i2.i; }