docc 0.8.3 (0d44999b)
C++ API Reference
Loading...
Searching...
No Matches
pointer_metadata.h
Go to the documentation of this file.
1#pragma once
2
3#include <memory>
4#include <nlohmann/json.hpp>
5#include <optional>
6
9#include "symengine/subs.h"
10
11namespace sdfg::data_flow {
12
15
16template<typename T>
19
20 PtrMetaDeleter(bool should_delete = true) : should_delete_(should_delete) {
21 }
22
23 void operator()(T* ptr) const {
24 if (should_delete_) {
25 delete ptr;
26 }
27 }
28};
29
32typedef std::unique_ptr<PointerAccessMeta, PtrAccessDeleter> PointerAccessType;
33typedef std::unique_ptr<MemoryAccessPattern, AccessPatternsDeleter> MemoryAccessPatternType;
34
36public:
37 virtual ~MemoryAccessPattern() = default;
38
42 virtual bool empty() const = 0;
43
50 virtual bool every_element_accessed() const = 0;
51
57 virtual const math::tensor::TensorLayout* layout() const {
58 return nullptr;
59 }
60
62
63 virtual void replace(const symbolic::Expression old_expression, const symbolic::Expression new_expression) = 0;
64 virtual void replace(const symbolic::ExpressionMapping& replacements) = 0;
65
66 virtual MemoryAccessPatternType clone() const = 0;
67
68 virtual void serialize_to_json(nlohmann::json& entry) = 0;
69};
70
72private:
74 bool not_sparse_ = false;
75
76public:
77 ConvexAccessPattern(symbolic::Expression size, bool not_sparse = false) : size_(size), not_sparse_(not_sparse) {
78 }
79
81 return size_;
82 }
83
84 bool empty() const override {
86 }
87
88 bool every_element_accessed() const override {
89 return not_sparse_;
90 }
91
92 void replace(const symbolic::Expression old_expression, const symbolic::Expression new_expression) override {
93 size_ = symbolic::subs(size_, old_expression, new_expression);
94 }
95 void replace(const symbolic::ExpressionMapping& replacements) override {
96 size_ = SymEngine::subs(size_, replacements);
97 }
98
100
101 void serialize_to_json(nlohmann::json& entry) override;
102
103 static MemoryAccessPatternType create(symbolic::Expression size, bool not_sparse = false);
104};
105
106class NoAccessPattern : public MemoryAccessPattern {
107private:
108 NoAccessPattern() {
109 }
110
111public:
112 bool empty() const override {
113 return true;
114 }
115
116 bool every_element_accessed() const override {
117 return true;
118 }
119
120 void replace(const symbolic::Expression old_expression, const symbolic::Expression new_expression) override {
121 }
122 void replace(const symbolic::ExpressionMapping& replacements) override {
123 }
124
126
127 void serialize_to_json(nlohmann::json& entry) override;
128
130};
131
139private:
141 bool not_sparse_ = false;
142
143public:
145 : layout_(std::move(layout)), not_sparse_(not_sparse) {
146 }
147
148 bool empty() const override {
149 return symbolic::null_safe_eq(layout_.total_elements(), symbolic::zero());
150 }
151
152 bool every_element_accessed() const override {
153 return not_sparse_;
154 }
155
156 const math::tensor::TensorLayout* layout() const override {
157 return &layout_;
158 }
159
160 void replace(const symbolic::Expression old_expression, const symbolic::Expression new_expression) override {
161 layout_.replace_symbols(old_expression, new_expression);
162 }
163 void replace(const symbolic::ExpressionMapping& replacements) override {
164 layout_.replace_symbols(replacements);
165 }
166
168
169 void serialize_to_json(nlohmann::json& entry) override;
170
172};
173
175protected:
176 PointerAccessMeta() = default;
177
178public:
179 virtual ~PointerAccessMeta() = default;
180
186 virtual bool no_capture() const = 0;
187
191 virtual bool may_contain_reads() const = 0;
192
196 virtual bool may_contain_writes() const = 0;
197
198 virtual bool invalidated_after() const = 0;
199
208
210
211 virtual void replace(const symbolic::Expression old_expression, const symbolic::Expression new_expression) = 0;
212 virtual void replace(const symbolic::ExpressionMapping& replacements) = 0;
213
214 virtual PointerAccessType clone() const = 0;
215
216 virtual void serialize_to_json(nlohmann::json& entry) = 0;
217
219 const symbolic::Expression& size,
220 bool no_capture,
221 std::optional<math::tensor::TensorLayout> layout = std::nullopt,
222 bool every_element_read = false
223 );
226 const symbolic::Expression& size,
227 bool no_capture,
228 std::optional<math::tensor::TensorLayout> layout = std::nullopt
229 );
230 static PointerAccessType
232};
233
234
240private:
241 MemoryAccessPatternType read_pattern_;
242 bool no_capture_;
243
244public:
246
252 bool no_capture() const override {
253 return no_capture_;
254 }
255
256 bool may_contain_reads() const override {
257 return true;
258 }
259 bool may_contain_writes() const override {
260 return false;
261 }
262
263 bool invalidated_after() const override {
264 return false;
265 }
266
271
273
274 void replace(const symbolic::Expression old_expression, const symbolic::Expression new_expression) override;
275 void replace(const symbolic::ExpressionMapping& replacements) override;
276
277 PointerAccessType clone() const override;
278
279 void serialize_to_json(nlohmann::json& entry) override;
280};
281
286private:
287 MemoryAccessPatternType write_pattern_;
288 bool no_capture_;
289
290public:
292
298
300
301 bool no_capture() const override {
302 return no_capture_;
303 }
304
305 bool may_contain_reads() const override {
306 return false;
307 }
308 bool may_contain_writes() const override {
309 return true;
310 }
311
312 bool invalidated_after() const override {
313 return false;
314 }
315
316 void replace(const symbolic::Expression old_expression, const symbolic::Expression new_expression) override;
317 void replace(const symbolic::ExpressionMapping& replacements) override;
318
319 PointerAccessType clone() const override;
320
321 void serialize_to_json(nlohmann::json& entry) override;
322};
323
330private:
331 MemoryAccessPatternType read_pattern_;
332 MemoryAccessPatternType write_pattern_;
333 bool no_capture_;
334
335public:
337
344
345 bool no_capture() const override {
346 return no_capture_;
347 }
348
349 bool may_contain_reads() const override;
350
351 bool may_contain_writes() const override;
352
353 bool invalidated_after() const override {
354 return false;
355 }
356
357 void replace(const symbolic::Expression old_expression, const symbolic::Expression new_expression) override;
358 void replace(const symbolic::ExpressionMapping& replacements) override;
359
360 PointerAccessType clone() const override;
361
362 void serialize_to_json(nlohmann::json& entry) override;
363};
364
372public:
373 bool no_capture() const override {
374 return true;
375 }
376
377 bool may_contain_reads() const override {
378 return false;
379 }
380 bool may_contain_writes() const override {
381 return false;
382 }
383
384 bool invalidated_after() const override {
385 return true;
386 }
387
394
395 void replace(const symbolic::Expression old_expression, const symbolic::Expression new_expression) override {
396 }
397 void replace(const symbolic::ExpressionMapping& replacements) override {
398 }
399
400 PointerAccessType clone() const override;
401
402 void serialize_to_json(nlohmann::json& entry) override;
403};
404
406 friend class PointerAccessMeta;
407
408public:
409 static std::vector<PointerAccessType> deserialize_list(nlohmann::json::const_reference list);
410 static std::vector<PointerAccessType>
411 deserialize_list(nlohmann::json::const_iterator key, const nlohmann::json& parent);
412
413 static PointerAccessType deserialize_read_only(nlohmann::json::const_reference entry);
414 static PointerAccessType deserialize_write_only(nlohmann::json::const_reference entry);
415 static PointerAccessType deserialize_generic(nlohmann::json::const_reference entry);
416
417 static MemoryAccessPatternType deserialize_convex_pattern(nlohmann::json::const_reference entry);
418 static MemoryAccessPatternType deserialize_tensor_layout_pattern(nlohmann::json::const_reference entry);
419 static MemoryAccessPatternType deserialize_access_pattern(nlohmann::json::const_reference entry);
420
421 static nlohmann::json serialize(const std::vector<PointerAccessType>& vector);
422
423 static PointerAccessType deserialize(const nlohmann::json& entry);
424};
425
426
427} // namespace sdfg::data_flow
bool empty() const override
There are no elements in this pattern = no accesses of this type.
Definition pointer_metadata.h:84
bool every_element_accessed() const override
Every element that is part of this pattern is actually accessed.
Definition pointer_metadata.h:88
MemoryAccessPatternType clone() const override
void replace(const symbolic::Expression old_expression, const symbolic::Expression new_expression) override
Definition pointer_metadata.h:92
ConvexAccessPattern(symbolic::Expression size, bool not_sparse=false)
Definition pointer_metadata.h:77
symbolic::Expression size() const
Definition pointer_metadata.h:80
void replace(const symbolic::ExpressionMapping &replacements) override
Definition pointer_metadata.h:95
void serialize_to_json(nlohmann::json &entry) override
static MemoryAccessPatternType create(symbolic::Expression size, bool not_sparse=false)
Definition pointer_metadata.h:35
virtual void serialize_to_json(nlohmann::json &entry)=0
virtual MemoryAccessPatternType clone() const =0
virtual void replace(const symbolic::ExpressionMapping &replacements)=0
virtual bool empty() const =0
There are no elements in this pattern = no accesses of this type.
virtual void replace(const symbolic::Expression old_expression, const symbolic::Expression new_expression)=0
MemoryAccessPatternType ref() const
virtual const math::tensor::TensorLayout * layout() const
The structured affine layout (shape/strides/offset, in elements) backing this pattern,...
Definition pointer_metadata.h:57
virtual bool every_element_accessed() const =0
Every element that is part of this pattern is actually accessed.
bool every_element_accessed() const override
Every element that is part of this pattern is actually accessed.
Definition pointer_metadata.h:116
bool empty() const override
There are no elements in this pattern = no accesses of this type.
Definition pointer_metadata.h:112
MemoryAccessPatternType clone() const override
void serialize_to_json(nlohmann::json &entry) override
static MemoryAccessPatternType instance()
void replace(const symbolic::ExpressionMapping &replacements) override
Definition pointer_metadata.h:122
void replace(const symbolic::Expression old_expression, const symbolic::Expression new_expression) override
Definition pointer_metadata.h:120
Definition pointer_metadata.h:405
static MemoryAccessPatternType deserialize_tensor_layout_pattern(nlohmann::json::const_reference entry)
static PointerAccessType deserialize_generic(nlohmann::json::const_reference entry)
static MemoryAccessPatternType deserialize_convex_pattern(nlohmann::json::const_reference entry)
static PointerAccessType deserialize(const nlohmann::json &entry)
static PointerAccessType deserialize_read_only(nlohmann::json::const_reference entry)
static MemoryAccessPatternType deserialize_access_pattern(nlohmann::json::const_reference entry)
static std::vector< PointerAccessType > deserialize_list(nlohmann::json::const_iterator key, const nlohmann::json &parent)
static std::vector< PointerAccessType > deserialize_list(nlohmann::json::const_reference list)
static nlohmann::json serialize(const std::vector< PointerAccessType > &vector)
static PointerAccessType deserialize_write_only(nlohmann::json::const_reference entry)
friend class PointerAccessMeta
Definition pointer_metadata.h:406
Definition pointer_metadata.h:174
static PointerAccessType create_generic(MemoryAccessPatternType read_pattern, MemoryAccessPatternType write_pattern, bool no_capture)
virtual MemoryAccessPatternType access_read_pattern() const =0
Describes which elements are accessed (for example a function may only access the range of [ptr,...
virtual void replace(const symbolic::Expression old_expression, const symbolic::Expression new_expression)=0
static PointerAccessType create_invalidate()
virtual void serialize_to_json(nlohmann::json &entry)=0
static PointerAccessType create_read_only(const symbolic::Expression &size, bool no_capture, std::optional< math::tensor::TensorLayout > layout=std::nullopt, bool every_element_read=false)
virtual PointerAccessType clone() const =0
virtual bool may_contain_writes() const =0
The pointe may be used to write to the backing data.
virtual bool invalidated_after() const =0
virtual void replace(const symbolic::ExpressionMapping &replacements)=0
PointerAccessType ref() const
static PointerAccessType create_full_write_only(const symbolic::Expression &size, bool no_capture, std::optional< math::tensor::TensorLayout > layout=std::nullopt)
virtual MemoryAccessPatternType access_write_pattern() const =0
virtual bool no_capture() const =0
Despite this being a leak of the pointer, the user will only use it for blocking accesses to the unde...
virtual ~PointerAccessMeta()=default
virtual bool may_contain_reads() const =0
The pointer may be used to read from the backing data.
PointerFullWriteOnly(MemoryAccessPatternType write_pattern, bool no_capture=false)
void replace(const symbolic::ExpressionMapping &replacements) override
MemoryAccessPatternType access_read_pattern() const override
Describes which elements are accessed (for example a function may only access the range of [ptr,...
bool may_contain_writes() const override
The pointe may be used to write to the backing data.
Definition pointer_metadata.h:308
void replace(const symbolic::Expression old_expression, const symbolic::Expression new_expression) override
void serialize_to_json(nlohmann::json &entry) override
PointerAccessType clone() const override
bool invalidated_after() const override
Definition pointer_metadata.h:312
MemoryAccessPatternType access_write_pattern() const override
Describes which elements are overwritten.
bool may_contain_reads() const override
The pointer may be used to read from the backing data.
Definition pointer_metadata.h:305
bool no_capture() const override
Despite this being a leak of the pointer, the user will only use it for blocking accesses to the unde...
Definition pointer_metadata.h:301
MemoryAccessPatternType access_read_pattern() const override
Allows limiting the undefined behavior (assume required input as well as dirtying) to a specific patt...
PointerAccessType clone() const override
bool no_capture() const override
Despite this being a leak of the pointer, the user will only use it for blocking accesses to the unde...
Definition pointer_metadata.h:345
PointerGenericAccess(MemoryAccessPatternType read_pattern, MemoryAccessPatternType write_pattern, bool no_capture)
void replace(const symbolic::Expression old_expression, const symbolic::Expression new_expression) override
bool may_contain_writes() const override
The pointe may be used to write to the backing data.
void replace(const symbolic::ExpressionMapping &replacements) override
void serialize_to_json(nlohmann::json &entry) override
MemoryAccessPatternType access_write_pattern() const override
bool may_contain_reads() const override
The pointer may be used to read from the backing data.
bool invalidated_after() const override
Definition pointer_metadata.h:353
Meaning the underlying memory will be deallocated and use of the pointer after this is no longer vali...
Definition pointer_metadata.h:371
bool invalidated_after() const override
Definition pointer_metadata.h:384
bool may_contain_reads() const override
The pointer may be used to read from the backing data.
Definition pointer_metadata.h:377
PointerAccessType clone() const override
bool may_contain_writes() const override
The pointe may be used to write to the backing data.
Definition pointer_metadata.h:380
void serialize_to_json(nlohmann::json &entry) override
MemoryAccessPatternType access_write_pattern() const override
Definition pointer_metadata.h:391
void replace(const symbolic::Expression old_expression, const symbolic::Expression new_expression) override
Definition pointer_metadata.h:395
void replace(const symbolic::ExpressionMapping &replacements) override
Definition pointer_metadata.h:397
MemoryAccessPatternType access_read_pattern() const override
Describes which elements are accessed (for example a function may only access the range of [ptr,...
Definition pointer_metadata.h:388
bool no_capture() const override
Despite this being a leak of the pointer, the user will only use it for blocking accesses to the unde...
Definition pointer_metadata.h:373
bool may_contain_writes() const override
The pointe may be used to write to the backing data.
Definition pointer_metadata.h:259
MemoryAccessPatternType access_write_pattern() const override
void serialize_to_json(nlohmann::json &entry) override
PointerReadOnly(MemoryAccessPatternType read_pattern, bool no_capture=false)
MemoryAccessPatternType access_read_pattern() const override
Describes which elements behind the pointer are actually read.
bool no_capture() const override
Despite this being a leak of the pointer, the user will only use it for blocking accesses to the unde...
Definition pointer_metadata.h:252
bool invalidated_after() const override
Definition pointer_metadata.h:263
PointerAccessType clone() const override
void replace(const symbolic::Expression old_expression, const symbolic::Expression new_expression) override
bool may_contain_reads() const override
The pointer may be used to read from the backing data.
Definition pointer_metadata.h:256
void replace(const symbolic::ExpressionMapping &replacements) override
bool empty() const override
There are no elements in this pattern = no accesses of this type.
Definition pointer_metadata.h:148
MemoryAccessPatternType clone() const override
bool every_element_accessed() const override
Every element that is part of this pattern is actually accessed.
Definition pointer_metadata.h:152
void replace(const symbolic::Expression old_expression, const symbolic::Expression new_expression) override
Definition pointer_metadata.h:160
const math::tensor::TensorLayout * layout() const override
The structured affine layout (shape/strides/offset, in elements) backing this pattern,...
Definition pointer_metadata.h:156
void serialize_to_json(nlohmann::json &entry) override
void replace(const symbolic::ExpressionMapping &replacements) override
Definition pointer_metadata.h:163
static MemoryAccessPatternType create(math::tensor::TensorLayout layout, bool not_sparse=false)
TensorLayoutPattern(math::tensor::TensorLayout layout, bool not_sparse=false)
Definition pointer_metadata.h:144
The metadata associated with a addressing a tensor in elements Meant to be used with TensorNodes to d...
Definition tensor_layout.h:20
Integer zero()
Creates the integer constant 0.
bool null_safe_eq(const Expression lhs, const Expression rhs)
Tests equality of expressions with null-safety.
Expression subs(const Expression expr, const Expression old_expr, const Expression new_expr)
Substitutes a sub-expression with another expression.
SymEngine::RCP< const SymEngine::Basic > Expression
Reference-counted pointer to a symbolic expression (SymEngine Basic).
Definition symbolic.h:83
SymEngine::map_basic_basic ExpressionMapping
Definition symbolic.h:109
Definition access_node.h:67
PtrMetaDeleter< PointerAccessMeta > PtrAccessDeleter
Definition pointer_metadata.h:30
PtrMetaDeleter< MemoryAccessPattern > AccessPatternsDeleter
Definition pointer_metadata.h:31
std::unique_ptr< MemoryAccessPattern, AccessPatternsDeleter > MemoryAccessPatternType
Definition pointer_metadata.h:33
std::unique_ptr< PointerAccessMeta, PtrAccessDeleter > PointerAccessType
Definition pointer_metadata.h:32
Definition pointer_metadata.h:17
bool should_delete_
Definition pointer_metadata.h:18
PtrMetaDeleter(bool should_delete=true)
Definition pointer_metadata.h:20
void operator()(T *ptr) const
Definition pointer_metadata.h:23
Symbolic system for integer-based symbol analysis.