Grid 0.7.0
MemoryManager.h
Go to the documentation of this file.
1/*************************************************************************************
2
3 Grid physics library, www.github.com/paboyle/Grid
4
5 Source file: ./lib/MemoryManager.h
6
7 Copyright (C) 2015
8
9Author: Azusa Yamaguchi <ayamaguc@staffmail.ed.ac.uk>
10Author: Peter Boyle <paboyle@ph.ed.ac.uk>
11
12 This program is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 2 of the License, or
15 (at your option) any later version.
16
17 This program is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
21
22 You should have received a copy of the GNU General Public License along
23 with this program; if not, write to the Free Software Foundation, Inc.,
24 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
25
26 See the full license in the file "LICENSE" in the top level distribution directory
27*************************************************************************************/
28/* END LEGAL */
29#pragma once
30#include <list>
31#include <unordered_map>
32
34
35// Move control to configure.ac and Config.h?
36
37#define GRID_ALLOC_SMALL_LIMIT (4096)
38#define GRID_ALLOC_HUGE_LIMIT (2147483648)
39
40#define STRINGIFY(x) #x
41#define TOSTRING(x) STRINGIFY(x)
42#define FILE_LINE __FILE__ ":" TOSTRING(__LINE__)
43#define AUDIT(a) MemoryManager::Audit(FILE_LINE)
44
45/*Pinning pages is costly*/
47// Advise the LatticeAccelerator class
50 AdviseDefault = 0x0, // Regular data
51 AdviseInfrequentUse = 0x1 // Advise that the data is used infrequently. This can
52 // significantly influence performance of bulk storage.
53
54 // AdviseTransient = 0x2, // Data will mostly be read. On some architectures
55 // enables read-only copies of memory to be kept on
56 // host and device.
57
58 // AdviseAcceleratorWriteDiscard = 0x4 // Field will be written in entirety on device
59
60};
61
63// View Access Mode
69 CpuRead = 0x08,
70 CpuWrite = 0x10,
71 CpuWriteDiscard = 0x10 // same for now
72};
73
88
90private:
91
93 // For caching recently freed allocations
95 typedef struct {
96 void *address;
97 size_t bytes;
98 int valid;
100
101 static const int NallocCacheMax=128;
102 static const int NallocType=9;
104 static int Victim[NallocType];
105 static int Ncache[NallocType];
106 static uint64_t CacheBytes[NallocType];
107
109 // Free pool
111 static void *Insert(void *ptr,size_t bytes,int type) ;
112 static void *Lookup(size_t bytes,int type) ;
113 static void *Insert(void *ptr,size_t bytes,AllocationCacheEntry *entries,int ncache,int &victim,uint64_t &cbytes) ;
114 static void *Lookup(size_t bytes,AllocationCacheEntry *entries,int ncache,uint64_t &cbytes) ;
115
116 public:
117 static void PrintBytes(void);
118 static void Audit(std::string s);
119 static void Init(void);
120 static void InitMessage(void);
121 static void *AcceleratorAllocate(size_t bytes);
122 static void AcceleratorFree (void *ptr,size_t bytes);
123 static void *SharedAllocate(size_t bytes);
124 static void SharedFree (void *ptr,size_t bytes);
125 static void *CpuAllocate(size_t bytes);
126 static void CpuFree (void *ptr,size_t bytes);
127
129 // Footprint tracking
131 static uint64_t DeviceBytes;
132 static uint64_t DeviceLRUBytes;
133 static uint64_t DeviceMaxBytes;
134 static uint64_t HostToDeviceBytes;
135 static uint64_t DeviceToHostBytes;
136 static uint64_t HostToDeviceXfer;
137 static uint64_t DeviceToHostXfer;
138 static uint64_t DeviceEvictions;
139 static uint64_t DeviceDestroy;
140
141 static uint64_t DeviceCacheBytes();
142 static uint64_t HostCacheBytes();
143
159
160 private:
161#ifndef GRID_UVM
163 // Data tables for ViewCache
165 typedef std::list<uint64_t> LRU_t;
166 typedef typename LRU_t::iterator LRUiterator;
167 typedef struct {
170 uint64_t CpuPtr;
171 uint64_t AccPtr;
172 size_t bytes;
173 uint32_t transient;
174 uint32_t state;
175 uint32_t accLock;
176 uint32_t cpuLock;
178
179 typedef std::unordered_map<uint64_t,AcceleratorViewEntry> AccViewTable_t;
180 typedef typename AccViewTable_t::iterator AccViewTableIterator ;
181
183 static LRU_t LRU;
184
186 // Device motion
188 static void Create(uint64_t CpuPtr,size_t bytes,ViewMode mode,ViewAdvise hint);
189 static void EvictVictims(uint64_t bytes); // Frees up <bytes>
190 static void Evict(AcceleratorViewEntry &AccCache);
191 static void Flush(AcceleratorViewEntry &AccCache);
192 static void Clone(AcceleratorViewEntry &AccCache);
193 static void AccDiscard(AcceleratorViewEntry &AccCache);
194 static void CpuDiscard(AcceleratorViewEntry &AccCache);
195
196 // static void LRUupdate(AcceleratorViewEntry &AccCache);
197 static void LRUinsert(AcceleratorViewEntry &AccCache);
198 static void LRUremove(AcceleratorViewEntry &AccCache);
199
200 // manage entries in the table
201 static int EntryPresent(uint64_t CpuPtr);
202 static void EntryCreate(uint64_t CpuPtr,size_t bytes,ViewMode mode,ViewAdvise hint);
203 static void EntryErase (uint64_t CpuPtr);
204 static AccViewTableIterator EntryLookup(uint64_t CpuPtr);
205 static void EntrySet (uint64_t CpuPtr,AcceleratorViewEntry &entry);
206
207 static void AcceleratorViewClose(uint64_t AccPtr);
208 static uint64_t AcceleratorViewOpen(uint64_t CpuPtr,size_t bytes,ViewMode mode,ViewAdvise hint);
209 static void CpuViewClose(uint64_t Ptr);
210 static uint64_t CpuViewOpen(uint64_t CpuPtr,size_t bytes,ViewMode mode,ViewAdvise hint);
211#endif
212
213 public:
214 static void DisplayMallinfo(void);
215 static void NotifyDeletion(void * CpuPtr);
216 static void Print(void);
217 static void PrintAll(void);
218 static void PrintState( void* CpuPtr);
219 static int isOpen (void* CpuPtr);
220 static void ViewClose(void* CpuPtr,ViewMode mode);
221 static void *ViewOpen (void* CpuPtr,size_t bytes,ViewMode mode,ViewAdvise hint);
222
223};
224
226
227
ViewMode
@ AcceleratorRead
@ CpuRead
@ AcceleratorWrite
@ CpuWriteDiscard
@ CpuWrite
@ AcceleratorWriteDiscard
ViewAdvise
@ AdviseInfrequentUse
@ AdviseDefault
#define NAMESPACE_BEGIN(A)
Definition Namespace.h:35
#define NAMESPACE_END(A)
Definition Namespace.h:36
LRU_t::iterator LRUiterator
static MemoryStatus GetFootprint(void)
static AccViewTable_t AccViewTable
static void LRUinsert(AcceleratorViewEntry &AccCache)
static uint64_t DeviceDestroy
static AccViewTableIterator EntryLookup(uint64_t CpuPtr)
static void CpuDiscard(AcceleratorViewEntry &AccCache)
static int Victim[NallocType]
static uint64_t DeviceLRUBytes
static const int NallocCacheMax
static void EvictVictims(uint64_t bytes)
static void Print(void)
static void PrintState(void *CpuPtr)
static void * ViewOpen(void *CpuPtr, size_t bytes, ViewMode mode, ViewAdvise hint)
static uint64_t DeviceCacheBytes()
static void * Lookup(size_t bytes, int type)
static void Flush(AcceleratorViewEntry &AccCache)
static void CpuFree(void *ptr, size_t bytes)
static const int NallocType
static void PrintBytes(void)
static void InitMessage(void)
static void DisplayMallinfo(void)
static uint64_t HostCacheBytes()
static void * Insert(void *ptr, size_t bytes, int type)
static uint64_t DeviceBytes
static uint64_t DeviceMaxBytes
std::unordered_map< uint64_t, AcceleratorViewEntry > AccViewTable_t
static void ViewClose(void *CpuPtr, ViewMode mode)
static void * CpuAllocate(size_t bytes)
static int Ncache[NallocType]
static void EntryCreate(uint64_t CpuPtr, size_t bytes, ViewMode mode, ViewAdvise hint)
static void NotifyDeletion(void *CpuPtr)
static void PrintAll(void)
static uint64_t DeviceToHostBytes
static LRU_t LRU
static void Audit(std::string s)
static uint64_t DeviceEvictions
static uint64_t CacheBytes[NallocType]
static void EntryErase(uint64_t CpuPtr)
static uint64_t AcceleratorViewOpen(uint64_t CpuPtr, size_t bytes, ViewMode mode, ViewAdvise hint)
static void AcceleratorViewClose(uint64_t AccPtr)
static uint64_t DeviceToHostXfer
static void Init(void)
static void CpuViewClose(uint64_t Ptr)
static void SharedFree(void *ptr, size_t bytes)
static void LRUremove(AcceleratorViewEntry &AccCache)
static AllocationCacheEntry Entries[NallocType][NallocCacheMax]
static uint64_t CpuViewOpen(uint64_t CpuPtr, size_t bytes, ViewMode mode, ViewAdvise hint)
static void Create(uint64_t CpuPtr, size_t bytes, ViewMode mode, ViewAdvise hint)
static void Evict(AcceleratorViewEntry &AccCache)
AccViewTable_t::iterator AccViewTableIterator
static void * SharedAllocate(size_t bytes)
static void * AcceleratorAllocate(size_t bytes)
static uint64_t HostToDeviceXfer
static uint64_t HostToDeviceBytes
static int isOpen(void *CpuPtr)
static void Clone(AcceleratorViewEntry &AccCache)
static void AccDiscard(AcceleratorViewEntry &AccCache)
static void AcceleratorFree(void *ptr, size_t bytes)
static int EntryPresent(uint64_t CpuPtr)
static void EntrySet(uint64_t CpuPtr, AcceleratorViewEntry &entry)
std::list< uint64_t > LRU_t
uint64_t DeviceToHostXfer
uint64_t HostToDeviceXfer
uint64_t HostToDeviceBytes
uint64_t DeviceMaxBytes
uint64_t DeviceBytes
uint64_t DeviceToHostBytes
uint64_t DeviceDestroy
uint64_t DeviceEvictions
uint64_t DeviceAllocCacheBytes
uint64_t HostAllocCacheBytes
uint64_t DeviceLRUBytes