diff --git a/lib/AlignedAllocator.h b/lib/AlignedAllocator.h index 8f69971d..d0de1ec3 100644 --- a/lib/AlignedAllocator.h +++ b/lib/AlignedAllocator.h @@ -40,14 +40,6 @@ Author: Peter Boyle #include #endif -#ifdef GRID_COMMS_SHMEM -extern "C" { -#include -extern void * shmem_align(size_t, size_t); -extern void shmem_free(void *); -} -#endif - namespace Grid { //////////////////////////////////////////////////////////////////// @@ -65,28 +57,81 @@ public: typedef _Tp value_type; template struct rebind { typedef alignedAllocator<_Tp1> other; }; - alignedAllocator() throw() { } - alignedAllocator(const alignedAllocator&) throw() { } - template alignedAllocator(const alignedAllocator<_Tp1>&) throw() { } - ~alignedAllocator() throw() { } - pointer address(reference __x) const { return &__x; } - // const_pointer address(const_reference __x) const { return &__x; } - size_type max_size() const throw() { return size_t(-1) / sizeof(_Tp); } pointer allocate(size_type __n, const void* _p= 0) { +#ifdef HAVE_MM_MALLOC_H + _Tp * ptr = (_Tp *) _mm_malloc(__n*sizeof(_Tp),128); +#else + _Tp * ptr = (_Tp *) memalign(128,__n*sizeof(_Tp)); +#endif + + _Tp tmp; +#ifdef GRID_NUMA +#pragma omp parallel for schedule(static) + for(int i=0;i<__n;i++){ + ptr[i]=tmp; + } +#endif + return ptr; + } + + void deallocate(pointer __p, size_type) { +#ifdef HAVE_MM_MALLOC_H + _mm_free((void *)__p); +#else + free((void *)__p); +#endif + } + void construct(pointer __p, const _Tp& __val) { }; + void construct(pointer __p) { }; + void destroy(pointer __p) { }; +}; +template inline bool operator==(const alignedAllocator<_Tp>&, const alignedAllocator<_Tp>&){ return true; } +template inline bool operator!=(const alignedAllocator<_Tp>&, const alignedAllocator<_Tp>&){ return false; } + +////////////////////////////////////////////////////////////////////////////////////////// +// MPI3 : comms must use shm region +// SHMEM: comms must use symmetric heap +////////////////////////////////////////////////////////////////////////////////////////// #ifdef GRID_COMMS_SHMEM - - _Tp *ptr = (_Tp *) shmem_align(__n*sizeof(_Tp),64); - - +extern "C" { +#include +extern void * shmem_align(size_t, size_t); +extern void shmem_free(void *); +} #define PARANOID_SYMMETRIC_HEAP +#endif + +template +class commAllocator { +public: + typedef std::size_t size_type; + typedef std::ptrdiff_t difference_type; + typedef _Tp* pointer; + typedef const _Tp* const_pointer; + typedef _Tp& reference; + typedef const _Tp& const_reference; + typedef _Tp value_type; + + template struct rebind { typedef commAllocator<_Tp1> other; }; + commAllocator() throw() { } + commAllocator(const commAllocator&) throw() { } + template commAllocator(const commAllocator<_Tp1>&) throw() { } + ~commAllocator() throw() { } + pointer address(reference __x) const { return &__x; } + size_type max_size() const throw() { return size_t(-1) / sizeof(_Tp); } + +#ifdef GRID_COMMS_SHMEM + pointer allocate(size_type __n, const void* _p= 0) + { + _Tp *ptr = (_Tp *) shmem_align(__n*sizeof(_Tp),64); #ifdef PARANOID_SYMMETRIC_HEAP static void * bcast; static long psync[_SHMEM_REDUCE_SYNC_SIZE]; @@ -99,51 +144,52 @@ public: BACKTRACEFILE(); exit(0); } - assert( bcast == (void *) ptr); - #endif + return ptr; + } + void deallocate(pointer __p, size_type) { + shmem_free((void *)__p); + } +#elif defined(GRID_COMMS_MPI3) + pointer allocate(size_type __n, const void* _p= 0) + { +#error "implement MPI3 windowed allocate" + + } + void deallocate(pointer __p, size_type) { +#error "implement MPI3 windowed allocate" + } #else - + pointer allocate(size_type __n, const void* _p= 0) #ifdef HAVE_MM_MALLOC_H _Tp * ptr = (_Tp *) _mm_malloc(__n*sizeof(_Tp),128); #else _Tp * ptr = (_Tp *) memalign(128,__n*sizeof(_Tp)); #endif - -#endif - _Tp tmp; -#ifdef GRID_NUMA -#pragma omp parallel for schedule(static) - for(int i=0;i<__n;i++){ - ptr[i]=tmp; - } -#endif return ptr; } - void deallocate(pointer __p, size_type) { -#ifdef GRID_COMMS_SHMEM - shmem_free((void *)__p); -#else #ifdef HAVE_MM_MALLOC_H _mm_free((void *)__p); #else free((void *)__p); -#endif #endif } +#endif void construct(pointer __p, const _Tp& __val) { }; void construct(pointer __p) { }; - void destroy(pointer __p) { }; }; +template inline bool operator==(const commAllocator<_Tp>&, const commAllocator<_Tp>&){ return true; } +template inline bool operator!=(const commAllocator<_Tp>&, const commAllocator<_Tp>&){ return false; } -template inline bool -operator==(const alignedAllocator<_Tp>&, const alignedAllocator<_Tp>&){ return true; } - -template inline bool -operator!=(const alignedAllocator<_Tp>&, const alignedAllocator<_Tp>&){ return false; } +//////////////////////////////////////////////////////////////////////////////// +// Template typedefs +//////////////////////////////////////////////////////////////////////////////// +template using Vector = std::vector >; +template using commVector = std::vector >; +template using Matrix = std::vector > >; }; // namespace Grid #endif