Grid 0.7.0
MemoryManagerCache.cc
Go to the documentation of this file.
1#include <Grid/GridCore.h>
2#ifndef GRID_UVM
3
5
6#define MAXLINE 512
7static char print_buffer [ MAXLINE ];
8
9#define mprintf(...) snprintf (print_buffer,MAXLINE, __VA_ARGS__ ); std::cout << GridLogMemory << print_buffer << std::endl;
10#define dprintf(...) snprintf (print_buffer,MAXLINE, __VA_ARGS__ ); std::cout << GridLogDebug << print_buffer << std::endl;
11//#define dprintf(...)
12//#define mprintf(...)
13
15// For caching copies of data on device
19
21// Footprint tracking
25uint64_t MemoryManager::DeviceMaxBytes = 1024*1024*128;
32
34// Priority ordering for unlocked entries
35// Empty
36// CpuDirty
37// Consistent
38// AccDirty
40#define Empty (0x0) /*Entry unoccupied */
41#define CpuDirty (0x1) /*CPU copy is golden, Acc buffer MAY not be allocated*/
42#define Consistent (0x2) /*ACC copy AND CPU copy are valid */
43#define AccDirty (0x4) /*ACC copy is golden */
44#define EvictNext (0x8) /*Priority for eviction*/
45
47// Mechanics of data table maintenance
49int MemoryManager::EntryPresent(uint64_t CpuPtr)
50{
51 if(AccViewTable.empty()) return 0;
52
53 auto count = AccViewTable.count(CpuPtr); assert((count==0)||(count==1));
54 return count;
55}
56void MemoryManager::EntryCreate(uint64_t CpuPtr,size_t bytes,ViewMode mode,ViewAdvise hint)
57{
58 assert(!EntryPresent(CpuPtr));
59 AcceleratorViewEntry AccCache;
60 AccCache.CpuPtr = CpuPtr;
61 AccCache.AccPtr = (uint64_t)NULL;
62 AccCache.bytes = bytes;
63 AccCache.state = CpuDirty;
64 AccCache.LRU_valid=0;
65 AccCache.transient=0;
66 AccCache.accLock=0;
67 AccCache.cpuLock=0;
68 AccViewTable[CpuPtr] = AccCache;
69}
71{
72 assert(EntryPresent(CpuPtr));
73 auto AccCacheIterator = AccViewTable.find(CpuPtr);
74 assert(AccCacheIterator!=AccViewTable.end());
75 return AccCacheIterator;
76}
77void MemoryManager::EntryErase(uint64_t CpuPtr)
78{
79 auto AccCache = EntryLookup(CpuPtr);
80 AccViewTable.erase(CpuPtr);
81}
82void MemoryManager::LRUinsert(AcceleratorViewEntry &AccCache)
83{
84 assert(AccCache.LRU_valid==0);
85 if (AccCache.transient) {
86 LRU.push_back(AccCache.CpuPtr);
87 AccCache.LRU_entry = --LRU.end();
88 } else {
89 LRU.push_front(AccCache.CpuPtr);
90 AccCache.LRU_entry = LRU.begin();
91 }
92 AccCache.LRU_valid = 1;
93 DeviceLRUBytes+=AccCache.bytes;
94}
95void MemoryManager::LRUremove(AcceleratorViewEntry &AccCache)
96{
97 assert(AccCache.LRU_valid==1);
98 LRU.erase(AccCache.LRU_entry);
99 AccCache.LRU_valid = 0;
100 DeviceLRUBytes-=AccCache.bytes;
101}
103// Accelerator cache motion & consistency logic
105void MemoryManager::AccDiscard(AcceleratorViewEntry &AccCache)
106{
108 // Remove from Accelerator, remove entry, without flush
109 // Cannot be locked. If allocated Must be in LRU pool.
111 assert(AccCache.state!=Empty);
112
113 dprintf("MemoryManager: Discard(%lx) %lx",(uint64_t)AccCache.CpuPtr,(uint64_t)AccCache.AccPtr);
114 assert(AccCache.accLock==0);
115 assert(AccCache.cpuLock==0);
116 assert(AccCache.CpuPtr!=(uint64_t)NULL);
117 if(AccCache.AccPtr) {
118 AcceleratorFree((void *)AccCache.AccPtr,AccCache.bytes);
120 DeviceBytes -=AccCache.bytes;
121 LRUremove(AccCache);
122 AccCache.AccPtr=(uint64_t) NULL;
123 dprintf("MemoryManager: Free(%lx) LRU %ld Total %ld",(uint64_t)AccCache.AccPtr,DeviceLRUBytes,DeviceBytes);
124 }
125 uint64_t CpuPtr = AccCache.CpuPtr;
126 EntryErase(CpuPtr);
127}
128
129void MemoryManager::Evict(AcceleratorViewEntry &AccCache)
130{
132 // Make CPU consistent, remove from Accelerator, remove from LRU, LEAVE CPU only entry
133 // Cannot be acclocked. If allocated must be in LRU pool.
134 //
135 // Nov 2022... Felix issue: Allocating two CpuPtrs, can have an entry in LRU-q with CPUlock.
136 // and require to evict the AccPtr copy. Eviction was a mistake in CpuViewOpen
137 // but there is a weakness where CpuLock entries are attempted for erase
138 // Take these OUT LRU queue when CPU locked?
139 // Cannot take out the table as cpuLock data is important.
141 assert(AccCache.state!=Empty);
142
143 mprintf("MemoryManager: Evict CpuPtr %lx AccPtr %lx cpuLock %ld accLock %ld",
144 (uint64_t)AccCache.CpuPtr,(uint64_t)AccCache.AccPtr,
145 (uint64_t)AccCache.cpuLock,(uint64_t)AccCache.accLock);
146 if (AccCache.accLock!=0) return;
147 if (AccCache.cpuLock!=0) return;
148 if(AccCache.state==AccDirty) {
149 Flush(AccCache);
150 }
151 if(AccCache.AccPtr) {
152 AcceleratorFree((void *)AccCache.AccPtr,AccCache.bytes);
153 LRUremove(AccCache);
154 AccCache.AccPtr=(uint64_t)NULL;
155 AccCache.state=CpuDirty; // CPU primary now
156 DeviceBytes -=AccCache.bytes;
157 dprintf("MemoryManager: Free(AccPtr %lx) footprint now %ld ",(uint64_t)AccCache.AccPtr,DeviceBytes);
158 }
159 // uint64_t CpuPtr = AccCache.CpuPtr;
161 // EntryErase(CpuPtr);
162}
163void MemoryManager::Flush(AcceleratorViewEntry &AccCache)
164{
165 assert(AccCache.state==AccDirty);
166 assert(AccCache.cpuLock==0);
167 assert(AccCache.accLock==0);
168 assert(AccCache.AccPtr!=(uint64_t)NULL);
169 assert(AccCache.CpuPtr!=(uint64_t)NULL);
170 acceleratorCopyFromDevice((void *)AccCache.AccPtr,(void *)AccCache.CpuPtr,AccCache.bytes);
171 mprintf("MemoryManager: acceleratorCopyFromDevice Flush size %ld AccPtr %lx -> CpuPtr %lx",(uint64_t)AccCache.bytes,(uint64_t)AccCache.AccPtr,(uint64_t)AccCache.CpuPtr); fflush(stdout);
172 DeviceToHostBytes+=AccCache.bytes;
174 AccCache.state=Consistent;
175}
176void MemoryManager::Clone(AcceleratorViewEntry &AccCache)
177{
178 assert(AccCache.state==CpuDirty);
179 assert(AccCache.cpuLock==0);
180 assert(AccCache.accLock==0);
181 assert(AccCache.CpuPtr!=(uint64_t)NULL);
182 if(AccCache.AccPtr==(uint64_t)NULL){
183 AccCache.AccPtr=(uint64_t)AcceleratorAllocate(AccCache.bytes);
184 DeviceBytes+=AccCache.bytes;
185 }
186 mprintf("MemoryManager: acceleratorCopyToDevice Clone size %ld AccPtr %lx <- CpuPtr %lx",
187 (uint64_t)AccCache.bytes,
188 (uint64_t)AccCache.AccPtr,(uint64_t)AccCache.CpuPtr); fflush(stdout);
189 acceleratorCopyToDevice((void *)AccCache.CpuPtr,(void *)AccCache.AccPtr,AccCache.bytes);
190 HostToDeviceBytes+=AccCache.bytes;
192 AccCache.state=Consistent;
193}
194
195void MemoryManager::CpuDiscard(AcceleratorViewEntry &AccCache)
196{
197 assert(AccCache.state!=Empty);
198 assert(AccCache.cpuLock==0);
199 assert(AccCache.accLock==0);
200 assert(AccCache.CpuPtr!=(uint64_t)NULL);
201 if(AccCache.AccPtr==(uint64_t)NULL){
202 AccCache.AccPtr=(uint64_t)AcceleratorAllocate(AccCache.bytes);
203 DeviceBytes+=AccCache.bytes;
204 }
205 AccCache.state=AccDirty;
206}
207
209// View management
211void MemoryManager::ViewClose(void* Ptr,ViewMode mode)
212{
213 if( (mode==AcceleratorRead)||(mode==AcceleratorWrite)||(mode==AcceleratorWriteDiscard) ){
214 dprintf("AcceleratorViewClose %lx",(uint64_t)Ptr);
215 AcceleratorViewClose((uint64_t)Ptr);
216 } else if( (mode==CpuRead)||(mode==CpuWrite)){
217 CpuViewClose((uint64_t)Ptr);
218 } else {
219 assert(0);
220 }
221}
222void *MemoryManager::ViewOpen(void* _CpuPtr,size_t bytes,ViewMode mode,ViewAdvise hint)
223{
224 uint64_t CpuPtr = (uint64_t)_CpuPtr;
225 if( (mode==AcceleratorRead)||(mode==AcceleratorWrite)||(mode==AcceleratorWriteDiscard) ){
226 dprintf("AcceleratorViewOpen %lx",(uint64_t)CpuPtr);
227 return (void *) AcceleratorViewOpen(CpuPtr,bytes,mode,hint);
228 } else if( (mode==CpuRead)||(mode==CpuWrite)){
229 return (void *)CpuViewOpen(CpuPtr,bytes,mode,hint);
230 } else {
231 assert(0);
232 return NULL;
233 }
234}
235void MemoryManager::EvictVictims(uint64_t bytes)
236{
237 if(bytes>=DeviceMaxBytes) {
238 printf("EvictVictims bytes %ld DeviceMaxBytes %ld\n",bytes,DeviceMaxBytes);
239 }
240 assert(bytes<DeviceMaxBytes);
241 while(bytes+DeviceLRUBytes > DeviceMaxBytes){
242 if ( DeviceLRUBytes > 0){
243 assert(LRU.size()>0);
244 uint64_t victim = LRU.back(); // From the LRU
245 auto AccCacheIterator = EntryLookup(victim);
246 auto & AccCache = AccCacheIterator->second;
247 Evict(AccCache);
248 } else {
249 return;
250 }
251 }
252}
253uint64_t MemoryManager::AcceleratorViewOpen(uint64_t CpuPtr,size_t bytes,ViewMode mode,ViewAdvise hint)
254{
256 // Find if present, otherwise get or force an empty
258 if ( EntryPresent(CpuPtr)==0 ){
259 EntryCreate(CpuPtr,bytes,mode,hint);
260 }
261
262 auto AccCacheIterator = EntryLookup(CpuPtr);
263 auto & AccCache = AccCacheIterator->second;
264 if (!AccCache.AccPtr) {
265 EvictVictims(bytes);
266 }
267 assert((mode==AcceleratorRead)||(mode==AcceleratorWrite)||(mode==AcceleratorWriteDiscard));
268
269 assert(AccCache.cpuLock==0); // Programming error
270
271 if(AccCache.state!=Empty) {
272 dprintf("ViewOpen found entry %lx %lx : sizes %ld %ld accLock %ld",
273 (uint64_t)AccCache.CpuPtr,
274 (uint64_t)CpuPtr,
275 (uint64_t)AccCache.bytes,
276 (uint64_t)bytes,
277 (uint64_t)AccCache.accLock);
278 assert(AccCache.CpuPtr == CpuPtr);
279 assert(AccCache.bytes ==bytes);
280 }
281/*
282 * State transitions and actions
283 *
284 * Action State StateNext Flush Clone
285 *
286 * AccRead Empty Consistent - Y
287 * AccWrite Empty AccDirty - Y
288 * AccRead CpuDirty Consistent - Y
289 * AccWrite CpuDirty AccDirty - Y
290 * AccRead Consistent Consistent - -
291 * AccWrite Consistent AccDirty - -
292 * AccRead AccDirty AccDirty - -
293 * AccWrite AccDirty AccDirty - -
294 */
295 if(AccCache.state==Empty) {
296 assert(AccCache.LRU_valid==0);
297 AccCache.CpuPtr = CpuPtr;
298 AccCache.AccPtr = (uint64_t)NULL;
299 AccCache.bytes = bytes;
300 AccCache.state = CpuDirty; // Cpu starts primary
301 if(mode==AcceleratorWriteDiscard){
302 CpuDiscard(AccCache);
303 AccCache.state = AccDirty; // Empty + AcceleratorWrite=> AccDirty
304 } else if(mode==AcceleratorWrite){
305 Clone(AccCache);
306 AccCache.state = AccDirty; // Empty + AcceleratorWrite=> AccDirty
307 } else {
308 Clone(AccCache);
309 AccCache.state = Consistent; // Empty + AccRead => Consistent
310 }
311 AccCache.accLock= 1;
312 dprintf("Copied Empty entry into device accLock= %d",AccCache.accLock);
313 } else if(AccCache.state==CpuDirty ){
314 if(mode==AcceleratorWriteDiscard) {
315 CpuDiscard(AccCache);
316 AccCache.state = AccDirty; // CpuDirty + AcceleratorWrite=> AccDirty
317 } else if(mode==AcceleratorWrite) {
318 Clone(AccCache);
319 AccCache.state = AccDirty; // CpuDirty + AcceleratorWrite=> AccDirty
320 } else {
321 Clone(AccCache);
322 AccCache.state = Consistent; // CpuDirty + AccRead => Consistent
323 }
324 AccCache.accLock++;
325 dprintf("CpuDirty entry into device ++accLock= %d",AccCache.accLock);
326 } else if(AccCache.state==Consistent) {
327 if((mode==AcceleratorWrite)||(mode==AcceleratorWriteDiscard))
328 AccCache.state = AccDirty; // Consistent + AcceleratorWrite=> AccDirty
329 else
330 AccCache.state = Consistent; // Consistent + AccRead => Consistent
331 AccCache.accLock++;
332 dprintf("Consistent entry into device ++accLock= %d",AccCache.accLock);
333 } else if(AccCache.state==AccDirty) {
334 if((mode==AcceleratorWrite)||(mode==AcceleratorWriteDiscard))
335 AccCache.state = AccDirty; // AccDirty + AcceleratorWrite=> AccDirty
336 else
337 AccCache.state = AccDirty; // AccDirty + AccRead => AccDirty
338 AccCache.accLock++;
339 dprintf("AccDirty entry ++accLock= %d",AccCache.accLock);
340 } else {
341 assert(0);
342 }
343
344 assert(AccCache.accLock>0);
345 // If view is opened on device must remove from LRU
346 if(AccCache.LRU_valid==1){
347 // must possibly remove from LRU as now locked on GPU
348 dprintf("AccCache entry removed from LRU ");
349 LRUremove(AccCache);
350 }
351
352 int transient =hint;
353 AccCache.transient= transient? EvictNext : 0;
354
355 return AccCache.AccPtr;
356}
358// look up & decrement lock count
360void MemoryManager::AcceleratorViewClose(uint64_t CpuPtr)
361{
362 auto AccCacheIterator = EntryLookup(CpuPtr);
363 auto & AccCache = AccCacheIterator->second;
364
365 assert(AccCache.cpuLock==0);
366 assert(AccCache.accLock>0);
367
368 AccCache.accLock--;
369 // Move to LRU queue if not locked and close on device
370 if(AccCache.accLock==0) {
371 dprintf("AccleratorViewClose %lx AccLock decremented to %ld move to LRU queue",(uint64_t)CpuPtr,(uint64_t)AccCache.accLock);
372 LRUinsert(AccCache);
373 } else {
374 dprintf("AccleratorViewClose %lx AccLock decremented to %ld",(uint64_t)CpuPtr,(uint64_t)AccCache.accLock);
375 }
376}
377void MemoryManager::CpuViewClose(uint64_t CpuPtr)
378{
379 auto AccCacheIterator = EntryLookup(CpuPtr);
380 auto & AccCache = AccCacheIterator->second;
381
382 assert(AccCache.cpuLock>0);
383 assert(AccCache.accLock==0);
384
385 AccCache.cpuLock--;
386}
387/*
388 * Action State StateNext Flush Clone
389 *
390 * CpuRead Empty CpuDirty - -
391 * CpuWrite Empty CpuDirty - -
392 * CpuRead CpuDirty CpuDirty - -
393 * CpuWrite CpuDirty CpuDirty - -
394 * CpuRead Consistent Consistent - -
395 * CpuWrite Consistent CpuDirty - -
396 * CpuRead AccDirty Consistent Y -
397 * CpuWrite AccDirty CpuDirty Y -
398 */
399uint64_t MemoryManager::CpuViewOpen(uint64_t CpuPtr,size_t bytes,ViewMode mode,ViewAdvise transient)
400{
402 // Find if present, otherwise get or force an empty
404 if ( EntryPresent(CpuPtr)==0 ){
405 EntryCreate(CpuPtr,bytes,mode,transient);
406 }
407
408 auto AccCacheIterator = EntryLookup(CpuPtr);
409 auto & AccCache = AccCacheIterator->second;
410
411 // CPU doesn't need to free space
412 // if (!AccCache.AccPtr) {
413 // EvictVictims(bytes);
414 // }
415
416 assert((mode==CpuRead)||(mode==CpuWrite));
417 assert(AccCache.accLock==0); // Programming error
418
419 if(AccCache.state!=Empty) {
420 assert(AccCache.CpuPtr == CpuPtr);
421 assert(AccCache.bytes==bytes);
422 }
423
424 if(AccCache.state==Empty) {
425 AccCache.CpuPtr = CpuPtr;
426 AccCache.AccPtr = (uint64_t)NULL;
427 AccCache.bytes = bytes;
428 AccCache.state = CpuDirty; // Empty + CpuRead/CpuWrite => CpuDirty
429 AccCache.accLock= 0;
430 AccCache.cpuLock= 1;
431 } else if(AccCache.state==CpuDirty ){
432 // AccPtr dont care, deferred allocate
433 AccCache.state = CpuDirty; // CpuDirty +CpuRead/CpuWrite => CpuDirty
434 AccCache.cpuLock++;
435 } else if(AccCache.state==Consistent) {
436 assert(AccCache.AccPtr != (uint64_t)NULL);
437 if(mode==CpuWrite)
438 AccCache.state = CpuDirty; // Consistent +CpuWrite => CpuDirty
439 else
440 AccCache.state = Consistent; // Consistent +CpuRead => Consistent
441 AccCache.cpuLock++;
442 } else if(AccCache.state==AccDirty) {
443 assert(AccCache.AccPtr != (uint64_t)NULL);
444 Flush(AccCache);
445 if(mode==CpuWrite) AccCache.state = CpuDirty; // AccDirty +CpuWrite => CpuDirty, Flush
446 else AccCache.state = Consistent; // AccDirty +CpuRead => Consistent, Flush
447 AccCache.cpuLock++;
448 } else {
449 assert(0); // should be unreachable
450 }
451
452 AccCache.transient= transient? EvictNext : 0;
453
454 return AccCache.CpuPtr;
455}
456void MemoryManager::NotifyDeletion(void *_ptr)
457{
458 // Look up in ViewCache
459 uint64_t ptr = (uint64_t)_ptr;
460 if(EntryPresent(ptr)) {
461 auto e = EntryLookup(ptr);
462 AccDiscard(e->second);
463 }
464}
465void MemoryManager::Print(void)
466{
467 PrintBytes();
468 std::cout << GridLogMessage << "--------------------------------------------" << std::endl;
469 std::cout << GridLogMessage << "Memory Manager " << std::endl;
470 std::cout << GridLogMessage << "--------------------------------------------" << std::endl;
471 std::cout << GridLogMessage << DeviceBytes << " bytes allocated on device " << std::endl;
472 std::cout << GridLogMessage << DeviceLRUBytes<< " bytes evictable on device " << std::endl;
473 std::cout << GridLogMessage << DeviceMaxBytes<< " bytes max on device " << std::endl;
474 std::cout << GridLogMessage << HostToDeviceXfer << " transfers to device " << std::endl;
475 std::cout << GridLogMessage << DeviceToHostXfer << " transfers from device " << std::endl;
476 std::cout << GridLogMessage << HostToDeviceBytes<< " bytes transfered to device " << std::endl;
477 std::cout << GridLogMessage << DeviceToHostBytes<< " bytes transfered from device " << std::endl;
478 std::cout << GridLogMessage << DeviceEvictions << " Evictions from device " << std::endl;
479 std::cout << GridLogMessage << DeviceDestroy << " Destroyed vectors on device " << std::endl;
480 std::cout << GridLogMessage << AccViewTable.size()<< " vectors " << LRU.size()<<" evictable"<< std::endl;
482 std::cout << GridLogMessage << "--------------------------------------------" << std::endl;
483}
485{
486 Print();
487 std::cout << GridLogMessage << std::endl;
488 std::cout << GridLogMessage << "--------------------------------------------" << std::endl;
489 std::cout << GridLogMessage << "CpuAddr\t\tAccAddr\t\tState\t\tcpuLock\taccLock\tLRU_valid "<<std::endl;
490 std::cout << GridLogMessage << "--------------------------------------------" << std::endl;
491 for(auto it=AccViewTable.begin();it!=AccViewTable.end();it++){
492 auto &AccCache = it->second;
493
494 std::string str;
495 if ( AccCache.state==Empty ) str = std::string("Empty");
496 if ( AccCache.state==CpuDirty ) str = std::string("CpuDirty");
497 if ( AccCache.state==AccDirty ) str = std::string("AccDirty");
498 if ( AccCache.state==Consistent)str = std::string("Consistent");
499
500 std::cout << GridLogMessage << "0x"<<std::hex<<AccCache.CpuPtr<<std::dec
501 << "\t0x"<<std::hex<<AccCache.AccPtr<<std::dec<<"\t" <<str
502 << "\t" << AccCache.cpuLock
503 << "\t" << AccCache.accLock
504 << "\t" << AccCache.LRU_valid<<std::endl;
505 }
506 std::cout << GridLogMessage << "--------------------------------------------" << std::endl;
507
508};
509int MemoryManager::isOpen (void* _CpuPtr)
510{
511 uint64_t CpuPtr = (uint64_t)_CpuPtr;
512 if ( EntryPresent(CpuPtr) ){
513 auto AccCacheIterator = EntryLookup(CpuPtr);
514 auto & AccCache = AccCacheIterator->second;
515 return AccCache.cpuLock+AccCache.accLock;
516 } else {
517 return 0;
518 }
519}
520void MemoryManager::Audit(std::string s)
521{
522 uint64_t CpuBytes=0;
523 uint64_t AccBytes=0;
524 uint64_t LruBytes1=0;
525 uint64_t LruBytes2=0;
526 uint64_t LruCnt=0;
527
528 std::cout << " Memory Manager::Audit() from "<<s<<std::endl;
529 for(auto it=LRU.begin();it!=LRU.end();it++){
530 uint64_t cpuPtr = *it;
531 assert(EntryPresent(cpuPtr));
532 auto AccCacheIterator = EntryLookup(cpuPtr);
533 auto & AccCache = AccCacheIterator->second;
534 LruBytes2+=AccCache.bytes;
535 assert(AccCache.LRU_valid==1);
536 assert(AccCache.LRU_entry==it);
537 }
538 std::cout << " Memory Manager::Audit() LRU queue matches table entries "<<std::endl;
539
540 for(auto it=AccViewTable.begin();it!=AccViewTable.end();it++){
541 auto &AccCache = it->second;
542
543 std::string str;
544 if ( AccCache.state==Empty ) str = std::string("Empty");
545 if ( AccCache.state==CpuDirty ) str = std::string("CpuDirty");
546 if ( AccCache.state==AccDirty ) str = std::string("AccDirty");
547 if ( AccCache.state==Consistent)str = std::string("Consistent");
548
549 CpuBytes+=AccCache.bytes;
550 if( AccCache.AccPtr ) AccBytes+=AccCache.bytes;
551 if( AccCache.LRU_valid ) LruBytes1+=AccCache.bytes;
552 if( AccCache.LRU_valid ) LruCnt++;
553
554 if ( AccCache.cpuLock || AccCache.accLock ) {
555 assert(AccCache.LRU_valid==0);
556
557 std::cout << GridLogError << s<< "\n\t 0x"<<std::hex<<AccCache.CpuPtr<<std::dec
558 << "\t0x"<<std::hex<<AccCache.AccPtr<<std::dec<<"\t" <<str
559 << "\t cpuLock " << AccCache.cpuLock
560 << "\t accLock " << AccCache.accLock
561 << "\t LRUvalid " << AccCache.LRU_valid<<std::endl;
562 }
563
564 assert( AccCache.cpuLock== 0 ) ;
565 assert( AccCache.accLock== 0 ) ;
566 }
567 std::cout << " Memory Manager::Audit() no locked table entries "<<std::endl;
568 assert(LruBytes1==LruBytes2);
569 assert(LruBytes1==DeviceLRUBytes);
570 std::cout << " Memory Manager::Audit() evictable bytes matches sum over table "<<std::endl;
571 assert(AccBytes==DeviceBytes);
572 std::cout << " Memory Manager::Audit() device bytes matches sum over table "<<std::endl;
573 assert(LruCnt == LRU.size());
574 std::cout << " Memory Manager::Audit() LRU entry count matches "<<std::endl;
575
576}
577
578void MemoryManager::PrintState(void* _CpuPtr)
579{
580 uint64_t CpuPtr = (uint64_t)_CpuPtr;
581
582 if ( EntryPresent(CpuPtr) ){
583 auto AccCacheIterator = EntryLookup(CpuPtr);
584 auto & AccCache = AccCacheIterator->second;
585 std::string str;
586 if ( AccCache.state==Empty ) str = std::string("Empty");
587 if ( AccCache.state==CpuDirty ) str = std::string("CpuDirty");
588 if ( AccCache.state==AccDirty ) str = std::string("AccDirty");
589 if ( AccCache.state==Consistent)str = std::string("Consistent");
590 if ( AccCache.state==EvictNext) str = std::string("EvictNext");
591
592 std::cout << GridLogMessage << "CpuAddr\t\tAccAddr\t\tState\t\tcpuLock\taccLock\tLRU_valid "<<std::endl;
593 std::cout << GridLogMessage << "\tx"<<std::hex<<AccCache.CpuPtr<<std::dec
594 << "\tx"<<std::hex<<AccCache.AccPtr<<std::dec<<"\t" <<str
595 << "\t" << AccCache.cpuLock
596 << "\t" << AccCache.accLock
597 << "\t" << AccCache.LRU_valid<<std::endl;
598
599 } else {
600 std::cout << GridLogMessage << "No Entry in AccCache table." << std::endl;
601 }
602}
603
605
606#endif
void acceleratorMem(void)
void acceleratorCopyToDevice(void *from, void *to, size_t bytes)
void acceleratorCopyFromDevice(void *from, void *to, size_t bytes)
GridLogger GridLogError(1, "Error", GridLogColours, "RED")
GridLogger GridLogMessage(1, "Message", GridLogColours, "NORMAL")
ViewMode
@ AcceleratorRead
@ CpuRead
@ AcceleratorWrite
@ CpuWrite
@ AcceleratorWriteDiscard
ViewAdvise
#define NAMESPACE_BEGIN(A)
Definition Namespace.h:35
#define NAMESPACE_END(A)
Definition Namespace.h:36
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 uint64_t DeviceLRUBytes
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 void Flush(AcceleratorViewEntry &AccCache)
static void PrintBytes(void)
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 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 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 CpuViewClose(uint64_t Ptr)
static void LRUremove(AcceleratorViewEntry &AccCache)
static uint64_t CpuViewOpen(uint64_t CpuPtr, size_t bytes, ViewMode mode, ViewAdvise hint)
static void Evict(AcceleratorViewEntry &AccCache)
AccViewTable_t::iterator AccViewTableIterator
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)
std::list< uint64_t > LRU_t