/************************************************************************************* Grid physics library, www.github.com/paboyle/Grid Source file: ./lib/MemoryManager.h Copyright (C) 2015 Author: Azusa Yamaguchi Author: Peter Boyle This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ #pragma once #include #include NAMESPACE_BEGIN(Grid); // Move control to configure.ac and Config.h? #undef ALLOCATION_CACHE #define GRID_ALLOC_ALIGN (2*1024*1024) #define GRID_ALLOC_SMALL_LIMIT (4096) /*Pinning pages is costly*/ //////////////////////////////////////////////////////////////////////////// // Advise the LatticeAccelerator class //////////////////////////////////////////////////////////////////////////// enum ViewAdvise { AdviseDefault = 0x0, // Reegular data AdviseInfrequentUse = 0x1, // Advise that the data is used infrequently. This can // significantly influence performance of bulk storage. AdviseTransient = 0x2, // Data will mostly be read. On some architectures // enables read-only copies of memory to be kept on // host and device. AdviseAcceleratorWriteDiscard = 0x4 // Field will be written in entirety on device }; //////////////////////////////////////////////////////////////////////////// // View Access Mode //////////////////////////////////////////////////////////////////////////// enum ViewMode { AcceleratorRead = 0x01, AcceleratorWrite = 0x02, AcceleratorWriteDiscard = 0x04, CpuRead = 0x08, CpuWrite = 0x10, CpuWriteDiscard = 0x10 // same for now }; class MemoryManager { private: //////////////////////////////////////////////////////////// // For caching recently freed allocations //////////////////////////////////////////////////////////// typedef struct { void *address; size_t bytes; int valid; } AllocationCacheEntry; static const int NallocCacheMax=128; static const int NallocType=4; static AllocationCacheEntry Entries[NallocType][NallocCacheMax]; static int Victim[NallocType]; static int Ncache[NallocType]; ///////////////////////////////////////////////// // Free pool ///////////////////////////////////////////////// static void *Insert(void *ptr,size_t bytes,int type) ; static void *Lookup(size_t bytes,int type) ; static void *Insert(void *ptr,size_t bytes,AllocationCacheEntry *entries,int ncache,int &victim) ; static void *Lookup(size_t bytes,AllocationCacheEntry *entries,int ncache) ; static void *AcceleratorAllocate(size_t bytes); static void AcceleratorFree (void *ptr,size_t bytes); public: static void Init(void); static void *CpuAllocate(size_t bytes); static void CpuFree (void *ptr,size_t bytes); //////////////////////////////////////////////////////// // Footprint tracking //////////////////////////////////////////////////////// static uint64_t DeviceBytes; static uint64_t DeviceLRUBytes; static uint64_t DeviceMaxBytes; static uint64_t HostToDeviceBytes; static uint64_t DeviceToHostBytes; static uint64_t HostToDeviceXfer; static uint64_t DeviceToHostXfer; private: #ifndef GRID_UVM ////////////////////////////////////////////////////////////////////// // Data tables for ViewCache ////////////////////////////////////////////////////////////////////// typedef std::list LRU_t; typedef typename LRU_t::iterator LRUiterator; typedef struct { int LRU_valid; LRUiterator LRU_entry; uint64_t CpuPtr; uint64_t AccPtr; size_t bytes; uint32_t transient; uint32_t state; uint32_t accLock; uint32_t cpuLock; } AcceleratorViewEntry; typedef std::unordered_map AccViewTable_t; typedef typename AccViewTable_t::iterator AccViewTableIterator ; static AccViewTable_t AccViewTable; static LRU_t LRU; static LRU_t LRU_transient; ///////////////////////////////////////////////// // Device motion ///////////////////////////////////////////////// static void Create(uint64_t CpuPtr,size_t bytes,ViewMode mode,ViewAdvise hint); static void EvictVictims(uint64_t bytes); // Frees up static void Evict(AcceleratorViewEntry &AccCache); static void Flush(AcceleratorViewEntry &AccCache); static void Clone(AcceleratorViewEntry &AccCache); static void AccDiscard(AcceleratorViewEntry &AccCache); static void CpuDiscard(AcceleratorViewEntry &AccCache); // static void LRUupdate(AcceleratorViewEntry &AccCache); static void LRUinsert(AcceleratorViewEntry &AccCache); static void LRUremove(AcceleratorViewEntry &AccCache); // manage entries in the table static int EntryPresent(uint64_t CpuPtr); static void EntryCreate(uint64_t CpuPtr,size_t bytes,ViewMode mode,ViewAdvise hint); static void EntryErase (uint64_t CpuPtr); static AccViewTableIterator EntryLookup(uint64_t CpuPtr); static void EntrySet (uint64_t CpuPtr,AcceleratorViewEntry &entry); static void AcceleratorViewClose(uint64_t AccPtr); static uint64_t AcceleratorViewOpen(uint64_t CpuPtr,size_t bytes,ViewMode mode,ViewAdvise hint); static void CpuViewClose(uint64_t Ptr); static uint64_t CpuViewOpen(uint64_t CpuPtr,size_t bytes,ViewMode mode,ViewAdvise hint); #endif static void NotifyDeletion(void * CpuPtr); public: static void Print(void); static int isOpen (void* CpuPtr); static void ViewClose(void* CpuPtr,ViewMode mode); static void *ViewOpen (void* CpuPtr,size_t bytes,ViewMode mode,ViewAdvise hint); }; NAMESPACE_END(Grid);