-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgem_forge_ops.cpp
More file actions
110 lines (96 loc) · 2.86 KB
/
gem_forge_ops.cpp
File metadata and controls
110 lines (96 loc) · 2.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#ifndef GEM_FORGE_OPS_H
#define GEM_FORGE_OPS_H
#include "gem5/m5ops.h"
#include <cstddef>
#include <map>
#include <string>
/**
* Provide fake implementation for m5 operations.
*/
struct Region {
std::string name;
uint64_t vaddr;
uint64_t elemSize;
size_t numElem;
size_t interleave = 64;
Region(const char *_name, uint64_t _vaddr, uint64_t _elemSize,
size_t _numElem)
: name(_name), vaddr(_vaddr), elemSize(_elemSize), numElem(_numElem) {}
};
namespace {
std::map<uint64_t, Region> regionMap;
Region *getRegion(const void *ptr) {
uint64_t vaddr = reinterpret_cast<uint64_t>(ptr);
auto iter = regionMap.upper_bound(vaddr);
if (iter == regionMap.begin()) {
return nullptr;
}
--iter;
auto ®ion = iter->second;
if (region.vaddr + region.numElem * region.elemSize <= vaddr) {
return nullptr;
}
return ®ion;
}
} // namespace
extern "C" void m5_stream_nuca_region(const char *regionName,
const void *buffer, uint64_t elementSize,
uint64_t dim1, uint64_t dim2,
uint64_t dim3) {
uint64_t numElem = dim1;
if (dim2) {
numElem *= dim2;
}
if (dim3) {
numElem *= dim3;
}
uint64_t vaddr = reinterpret_cast<uint64_t>(buffer);
regionMap.emplace(
std::piecewise_construct, std::forward_as_tuple(vaddr),
std::forward_as_tuple(regionName, vaddr, elementSize, numElem));
}
extern "C" void
m5_stream_nuca_set_property(const void *buffer,
enum StreamNUCARegionProperty property,
uint64_t value) {
if (property == STREAM_NUCA_REGION_PROPERTY_INTERLEAVE) {
if (auto region = getRegion(buffer)) {
region->interleave = value;
}
}
}
extern "C" uint64_t
m5_stream_nuca_get_property(const void *buffer,
enum StreamNUCARegionProperty property) {
if (property == STREAM_NUCA_REGION_PROPERTY_BANK_ROWS) {
return 8;
}
if (property == STREAM_NUCA_REGION_PROPERTY_BANK_COLS) {
return 8;
}
if (property == STREAM_NUCA_REGION_PROPERTY_INTERLEAVE) {
if (auto region = getRegion(buffer)) {
return region->interleave;
}
return 64;
}
if (property == STREAM_NUCA_REGION_PROPERTY_START_BANK) {
return 0;
}
const size_t pageShift = 12;
if (property == STREAM_NUCA_REGION_PROPERTY_START_VADDR) {
if (auto region = getRegion(buffer)) {
return region->vaddr;
}
return (reinterpret_cast<size_t>(buffer) >> pageShift) << pageShift;
}
if (property == STREAM_NUCA_REGION_PROPERTY_END_VADDR) {
if (auto region = getRegion(buffer)) {
return region->vaddr + region->elemSize * region->numElem;
}
return ((reinterpret_cast<size_t>(buffer) >> pageShift) + 1) << pageShift;
}
assert(false && "Illegal RegionPropoerty");
}
extern "C" void m5_stream_nuca_remap() {}
#endif