mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-04-30 07:44:10 +08:00
Add a EIGEN_DEFAULT_ALIGN_BYTES macro defining default alignment for alloca and aligned_malloc.
It is defined as the max of EIGEN_IDEAL_MAX_ALIGN_BYTES and EIGEN_MAX_ALIGN_BYTES
This commit is contained in:
parent
7e0d7a76b8
commit
d4f5efc51a
@ -668,6 +668,12 @@ namespace Eigen {
|
|||||||
#define EIGEN_MAX_ALIGN_BYTES EIGEN_IDEAL_MAX_ALIGN_BYTES
|
#define EIGEN_MAX_ALIGN_BYTES EIGEN_IDEAL_MAX_ALIGN_BYTES
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if EIGEN_IDEAL_MAX_ALIGN_BYTES > EIGEN_MAX_ALIGN_BYTES
|
||||||
|
#define EIGEN_DEFAULT_ALIGN_BYTES EIGEN_IDEAL_MAX_ALIGN_BYTES
|
||||||
|
#else
|
||||||
|
#define EIGEN_DEFAULT_ALIGN_BYTES EIGEN_MAX_ALIGN_BYTES
|
||||||
|
#endif
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
// page 114, "[The] LP64 model [...] is used by all 64-bit UNIX ports" so it's indeed
|
// page 114, "[The] LP64 model [...] is used by all 64-bit UNIX ports" so it's indeed
|
||||||
// quite safe, at least within the context of glibc, to equate 64-bit with LP64.
|
// quite safe, at least within the context of glibc, to equate 64-bit with LP64.
|
||||||
#if defined(__GLIBC__) && ((__GLIBC__>=2 && __GLIBC_MINOR__ >= 8) || __GLIBC__>2) \
|
#if defined(__GLIBC__) && ((__GLIBC__>=2 && __GLIBC_MINOR__ >= 8) || __GLIBC__>2) \
|
||||||
&& defined(__LP64__) && ! defined( __SANITIZE_ADDRESS__ ) && (EIGEN_MAX_ALIGN_BYTES == 16)
|
&& defined(__LP64__) && ! defined( __SANITIZE_ADDRESS__ ) && (EIGEN_DEFAULT_ALIGN_BYTES == 16)
|
||||||
#define EIGEN_GLIBC_MALLOC_ALREADY_ALIGNED 1
|
#define EIGEN_GLIBC_MALLOC_ALREADY_ALIGNED 1
|
||||||
#else
|
#else
|
||||||
#define EIGEN_GLIBC_MALLOC_ALREADY_ALIGNED 0
|
#define EIGEN_GLIBC_MALLOC_ALREADY_ALIGNED 0
|
||||||
@ -42,14 +42,14 @@
|
|||||||
// See http://svn.freebsd.org/viewvc/base/stable/6/lib/libc/stdlib/malloc.c?view=markup
|
// See http://svn.freebsd.org/viewvc/base/stable/6/lib/libc/stdlib/malloc.c?view=markup
|
||||||
// FreeBSD 7 seems to have 16-byte aligned malloc except on ARM and MIPS architectures
|
// FreeBSD 7 seems to have 16-byte aligned malloc except on ARM and MIPS architectures
|
||||||
// See http://svn.freebsd.org/viewvc/base/stable/7/lib/libc/stdlib/malloc.c?view=markup
|
// See http://svn.freebsd.org/viewvc/base/stable/7/lib/libc/stdlib/malloc.c?view=markup
|
||||||
#if defined(__FreeBSD__) && !(EIGEN_ARCH_ARM || EIGEN_ARCH_MIPS) && (EIGEN_MAX_ALIGN_BYTES == 16)
|
#if defined(__FreeBSD__) && !(EIGEN_ARCH_ARM || EIGEN_ARCH_MIPS) && (EIGEN_DEFAULT_ALIGN_BYTES == 16)
|
||||||
#define EIGEN_FREEBSD_MALLOC_ALREADY_ALIGNED 1
|
#define EIGEN_FREEBSD_MALLOC_ALREADY_ALIGNED 1
|
||||||
#else
|
#else
|
||||||
#define EIGEN_FREEBSD_MALLOC_ALREADY_ALIGNED 0
|
#define EIGEN_FREEBSD_MALLOC_ALREADY_ALIGNED 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (EIGEN_OS_MAC && (EIGEN_MAX_ALIGN_BYTES == 16)) \
|
#if (EIGEN_OS_MAC && (EIGEN_DEFAULT_ALIGN_BYTES == 16)) \
|
||||||
|| (EIGEN_OS_WIN64 && (EIGEN_MAX_ALIGN_BYTES == 16)) \
|
|| (EIGEN_OS_WIN64 && (EIGEN_DEFAULT_ALIGN_BYTES == 16)) \
|
||||||
|| EIGEN_GLIBC_MALLOC_ALREADY_ALIGNED \
|
|| EIGEN_GLIBC_MALLOC_ALREADY_ALIGNED \
|
||||||
|| EIGEN_FREEBSD_MALLOC_ALREADY_ALIGNED
|
|| EIGEN_FREEBSD_MALLOC_ALREADY_ALIGNED
|
||||||
#define EIGEN_MALLOC_ALREADY_ALIGNED 1
|
#define EIGEN_MALLOC_ALREADY_ALIGNED 1
|
||||||
@ -107,9 +107,9 @@ inline void throw_std_bad_alloc()
|
|||||||
*/
|
*/
|
||||||
inline void* handmade_aligned_malloc(std::size_t size)
|
inline void* handmade_aligned_malloc(std::size_t size)
|
||||||
{
|
{
|
||||||
void *original = std::malloc(size+EIGEN_MAX_ALIGN_BYTES);
|
void *original = std::malloc(size+EIGEN_DEFAULT_ALIGN_BYTES);
|
||||||
if (original == 0) return 0;
|
if (original == 0) return 0;
|
||||||
void *aligned = reinterpret_cast<void*>((reinterpret_cast<std::size_t>(original) & ~(std::size_t(EIGEN_MAX_ALIGN_BYTES-1))) + EIGEN_MAX_ALIGN_BYTES);
|
void *aligned = reinterpret_cast<void*>((reinterpret_cast<std::size_t>(original) & ~(std::size_t(EIGEN_DEFAULT_ALIGN_BYTES-1))) + EIGEN_DEFAULT_ALIGN_BYTES);
|
||||||
*(reinterpret_cast<void**>(aligned) - 1) = original;
|
*(reinterpret_cast<void**>(aligned) - 1) = original;
|
||||||
return aligned;
|
return aligned;
|
||||||
}
|
}
|
||||||
@ -130,9 +130,9 @@ inline void* handmade_aligned_realloc(void* ptr, std::size_t size, std::size_t =
|
|||||||
if (ptr == 0) return handmade_aligned_malloc(size);
|
if (ptr == 0) return handmade_aligned_malloc(size);
|
||||||
void *original = *(reinterpret_cast<void**>(ptr) - 1);
|
void *original = *(reinterpret_cast<void**>(ptr) - 1);
|
||||||
std::ptrdiff_t previous_offset = static_cast<char *>(ptr)-static_cast<char *>(original);
|
std::ptrdiff_t previous_offset = static_cast<char *>(ptr)-static_cast<char *>(original);
|
||||||
original = std::realloc(original,size+EIGEN_MAX_ALIGN_BYTES);
|
original = std::realloc(original,size+EIGEN_DEFAULT_ALIGN_BYTES);
|
||||||
if (original == 0) return 0;
|
if (original == 0) return 0;
|
||||||
void *aligned = reinterpret_cast<void*>((reinterpret_cast<std::size_t>(original) & ~(std::size_t(EIGEN_MAX_ALIGN_BYTES-1))) + EIGEN_MAX_ALIGN_BYTES);
|
void *aligned = reinterpret_cast<void*>((reinterpret_cast<std::size_t>(original) & ~(std::size_t(EIGEN_DEFAULT_ALIGN_BYTES-1))) + EIGEN_DEFAULT_ALIGN_BYTES);
|
||||||
void *previous_aligned = static_cast<char *>(original)+previous_offset;
|
void *previous_aligned = static_cast<char *>(original)+previous_offset;
|
||||||
if(aligned!=previous_aligned)
|
if(aligned!=previous_aligned)
|
||||||
std::memmove(aligned, previous_aligned, size);
|
std::memmove(aligned, previous_aligned, size);
|
||||||
@ -218,16 +218,16 @@ EIGEN_DEVICE_FUNC inline void* aligned_malloc(size_t size)
|
|||||||
check_that_malloc_is_allowed();
|
check_that_malloc_is_allowed();
|
||||||
|
|
||||||
void *result;
|
void *result;
|
||||||
#if EIGEN_MAX_ALIGN_BYTES==0
|
#if EIGEN_DEFAULT_ALIGN_BYTES==0
|
||||||
result = std::malloc(size);
|
result = std::malloc(size);
|
||||||
#elif EIGEN_MALLOC_ALREADY_ALIGNED
|
#elif EIGEN_MALLOC_ALREADY_ALIGNED
|
||||||
result = std::malloc(size);
|
result = std::malloc(size);
|
||||||
#elif EIGEN_HAS_POSIX_MEMALIGN
|
#elif EIGEN_HAS_POSIX_MEMALIGN
|
||||||
if(posix_memalign(&result, EIGEN_MAX_ALIGN_BYTES, size)) result = 0;
|
if(posix_memalign(&result, EIGEN_DEFAULT_ALIGN_BYTES, size)) result = 0;
|
||||||
#elif EIGEN_HAS_MM_MALLOC
|
#elif EIGEN_HAS_MM_MALLOC
|
||||||
result = _mm_malloc(size, EIGEN_MAX_ALIGN_BYTES);
|
result = _mm_malloc(size, EIGEN_DEFAULT_ALIGN_BYTES);
|
||||||
#elif EIGEN_OS_WIN_STRICT
|
#elif EIGEN_OS_WIN_STRICT
|
||||||
result = _aligned_malloc(size, EIGEN_MAX_ALIGN_BYTES);
|
result = _aligned_malloc(size, EIGEN_DEFAULT_ALIGN_BYTES);
|
||||||
#else
|
#else
|
||||||
result = handmade_aligned_malloc(size);
|
result = handmade_aligned_malloc(size);
|
||||||
#endif
|
#endif
|
||||||
@ -241,7 +241,7 @@ EIGEN_DEVICE_FUNC inline void* aligned_malloc(size_t size)
|
|||||||
/** \internal Frees memory allocated with aligned_malloc. */
|
/** \internal Frees memory allocated with aligned_malloc. */
|
||||||
EIGEN_DEVICE_FUNC inline void aligned_free(void *ptr)
|
EIGEN_DEVICE_FUNC inline void aligned_free(void *ptr)
|
||||||
{
|
{
|
||||||
#if EIGEN_MAX_ALIGN_BYTES==0
|
#if EIGEN_DEFAULT_ALIGN_BYTES==0
|
||||||
std::free(ptr);
|
std::free(ptr);
|
||||||
#elif EIGEN_MALLOC_ALREADY_ALIGNED
|
#elif EIGEN_MALLOC_ALREADY_ALIGNED
|
||||||
std::free(ptr);
|
std::free(ptr);
|
||||||
@ -266,7 +266,7 @@ inline void* aligned_realloc(void *ptr, size_t new_size, size_t old_size)
|
|||||||
EIGEN_UNUSED_VARIABLE(old_size);
|
EIGEN_UNUSED_VARIABLE(old_size);
|
||||||
|
|
||||||
void *result;
|
void *result;
|
||||||
#if EIGEN_MAX_ALIGN_BYTES==0
|
#if EIGEN_DEFAULT_ALIGN_BYTES==0
|
||||||
result = std::realloc(ptr,new_size);
|
result = std::realloc(ptr,new_size);
|
||||||
#elif EIGEN_MALLOC_ALREADY_ALIGNED
|
#elif EIGEN_MALLOC_ALREADY_ALIGNED
|
||||||
result = std::realloc(ptr,new_size);
|
result = std::realloc(ptr,new_size);
|
||||||
@ -277,12 +277,12 @@ inline void* aligned_realloc(void *ptr, size_t new_size, size_t old_size)
|
|||||||
// implements _mm_malloc/_mm_free based on the corresponding _aligned_
|
// implements _mm_malloc/_mm_free based on the corresponding _aligned_
|
||||||
// functions. This may not always be the case and we just try to be safe.
|
// functions. This may not always be the case and we just try to be safe.
|
||||||
#if EIGEN_OS_WIN_STRICT && defined(_mm_free)
|
#if EIGEN_OS_WIN_STRICT && defined(_mm_free)
|
||||||
result = _aligned_realloc(ptr,new_size,EIGEN_MAX_ALIGN_BYTES);
|
result = _aligned_realloc(ptr,new_size,EIGEN_DEFAULT_ALIGN_BYTES);
|
||||||
#else
|
#else
|
||||||
result = generic_aligned_realloc(ptr,new_size,old_size);
|
result = generic_aligned_realloc(ptr,new_size,old_size);
|
||||||
#endif
|
#endif
|
||||||
#elif EIGEN_OS_WIN_STRICT
|
#elif EIGEN_OS_WIN_STRICT
|
||||||
result = _aligned_realloc(ptr,new_size,EIGEN_MAX_ALIGN_BYTES);
|
result = _aligned_realloc(ptr,new_size,EIGEN_DEFAULT_ALIGN_BYTES);
|
||||||
#else
|
#else
|
||||||
result = handmade_aligned_realloc(ptr,new_size,old_size);
|
result = handmade_aligned_realloc(ptr,new_size,old_size);
|
||||||
#endif
|
#endif
|
||||||
@ -689,9 +689,14 @@ template<typename T> void swap(scoped_array<T> &a,scoped_array<T> &b)
|
|||||||
* The underlying stack allocation function can controlled with the EIGEN_ALLOCA preprocessor token.
|
* The underlying stack allocation function can controlled with the EIGEN_ALLOCA preprocessor token.
|
||||||
*/
|
*/
|
||||||
#ifdef EIGEN_ALLOCA
|
#ifdef EIGEN_ALLOCA
|
||||||
// We always manually re-align the result of EIGEN_ALLOCA.
|
|
||||||
// If alloca is already aligned, the compiler should be smart enough to optimize away the re-alignment.
|
#if EIGEN_DEFAULT_ALIGN_BYTES>0
|
||||||
#define EIGEN_ALIGNED_ALLOCA(SIZE) reinterpret_cast<void*>((reinterpret_cast<size_t>(EIGEN_ALLOCA(SIZE+EIGEN_MAX_ALIGN_BYTES-1)) + EIGEN_MAX_ALIGN_BYTES-1) & ~(size_t(EIGEN_MAX_ALIGN_BYTES-1)))
|
// We always manually re-align the result of EIGEN_ALLOCA.
|
||||||
|
// If alloca is already aligned, the compiler should be smart enough to optimize away the re-alignment.
|
||||||
|
#define EIGEN_ALIGNED_ALLOCA(SIZE) reinterpret_cast<void*>((reinterpret_cast<std::size_t>(EIGEN_ALLOCA(SIZE+EIGEN_DEFAULT_ALIGN_BYTES-1)) + EIGEN_DEFAULT_ALIGN_BYTES-1) & ~(std::size_t(EIGEN_DEFAULT_ALIGN_BYTES-1)))
|
||||||
|
#else
|
||||||
|
#define EIGEN_ALIGNED_ALLOCA(SIZE) EIGEN_ALLOCA(SIZE)
|
||||||
|
#endif
|
||||||
|
|
||||||
#define ei_declare_aligned_stack_constructed_variable(TYPE,NAME,SIZE,BUFFER) \
|
#define ei_declare_aligned_stack_constructed_variable(TYPE,NAME,SIZE,BUFFER) \
|
||||||
Eigen::internal::check_size_for_overflow<TYPE>(SIZE); \
|
Eigen::internal::check_size_for_overflow<TYPE>(SIZE); \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user