FreeTensor
Loading...
Searching...
No Matches
deps.h
Go to the documentation of this file.
1#ifndef FREE_TENSOR_DEPS_H
2#define FREE_TENSOR_DEPS_H
3
4#include <functional>
5#include <iostream>
6#include <mutex>
7#include <string>
8#include <unordered_map>
9#include <unordered_set>
10#include <vector>
11
13#include <analyze/find_stmt.h>
15#include <analyze/track_stmt.h>
16#include <container_utils.h>
17#include <lazy.h>
18#include <math/gen_pb_expr.h>
19#include <math/presburger.h>
20#include <serialize/to_string.h>
21#include <sync_func.h>
22#include <visitor.h>
23
24namespace freetensor {
25
26struct IterAxis {
30
31 IterAxis(Expr iter, const ParallelScope &parallel = serialScope,
32 bool negStep = false)
33 : iter_(iter), parallel_(parallel), negStep_(negStep) {}
34};
35
41
42 AccessPointBase(const AST &op, const Stmt &stmt, const VarDef &def,
43 const Ref<Buffer> &buffer)
44 : op_(op), stmt_(stmt), def_(def), buffer_(buffer) {}
45};
46
48 int defAxis_ = -1;
49 std::vector<IterAxis> iter_;
50 std::vector<Expr> access_;
51 std::vector<std::pair<Expr, ID>>
54
55 AccessPoint(const AST &op, const Stmt &stmt, const VarDef &def,
56 const Ref<Buffer> &buffer)
57 : AccessPointBase(op, stmt, def, buffer) {}
58
59 void addCoord(int defAxis, auto &&iter, auto &&access, auto &&conds) {
60 defAxis_ = defAxis;
61 iter_ = std::forward<decltype(iter)>(iter);
62 access_ = std::forward<decltype(access)>(access);
63 conds_ = std::forward<decltype(conds)>(conds);
64 }
65};
66
67class FindAllNoDeps : public Visitor {
68 std::unordered_map<std::string, std::vector<ID>>
69 results_; // Var name -> [loop ID]
70 // FIXME: Currently, we record a var name to loop ID relation, which is not
71 // rigorous because there will be different vars with the same name.
72 // Recording a VarDef ID to loop ID relation may be a better choice.
73 // However, VarDef may be INSIDE a loop after pass/gpu/normalize_threads,
74 // and we are unable to find the VarDef ID
75
76 public:
77 const std::unordered_map<std::string, std::vector<ID>> &results() const {
78 return results_;
79 }
80
81 protected:
82 void visit(const For &op) override;
83};
84
86typedef std::function<bool(const AccessPoint &)> FindDepsAccPtFilter;
87typedef std::function<bool(const AccessPoint &later,
88 const AccessPoint &earlier)>
90
91typedef int DepType;
92const DepType DEP_WAW = 0x1;
93const DepType DEP_WAR = 0x2;
94const DepType DEP_RAW = 0x4;
96
100class FindAccessPoint : public SymbolTable<TrackStmt<Visitor>> {
102
103 ID vardef_;
104 const FindDepsAccFilter &accFilter_;
105
106 bool lastIsLoad_ =
107 false; // True to indicate the last statement is a Load. If the next
108 // statement is still a Load, they can share the same coordinate
109 std::vector<IterAxis> cur_; // Current iteration point in the space
110 std::vector<std::pair<Expr, ID>>
111 conds_; // FIXME: There may be out-dated conditions, and we must check
112 // allReads(cond) against allWrites(body) for each If or For
113 // nodes. See pass/simplify.
114 std::vector<Ref<AccessPoint>> reads_, writes_;
115
116 // For or StmtSeq -> coordinate in iteration space
117 std::unordered_map<ID, std::vector<IterAxis>> scope2coord_;
118
119 std::vector<ID> allScopes_;
120
121 // Which axis is a the var defined
122 int defAxis_ = -1;
123
124 private:
125 // Please use `doFind` instead
126 using BaseClass::operator();
127
128 void pushCond(const Expr &cond, const ID &baseStmtId) {
129 conds_.emplace_back(cond, baseStmtId);
130 }
131
132 void popCond() { conds_.pop_back(); }
133
139 bool checkTrivialScope(std::vector<Ref<AccessPoint>>::iterator begin,
140 std::vector<Ref<AccessPoint>>::iterator end);
141 void removeTrivialScopeFromAccesses(
142 std::vector<Ref<AccessPoint>>::iterator begin,
143 std::vector<Ref<AccessPoint>>::iterator end);
144 void removeTrivialScopeFromScopes(std::vector<ID>::iterator begin,
145 std::vector<ID>::iterator end);
148 public:
149 FindAccessPoint(const ID &vardef, const FindDepsAccFilter &accFilter);
150
151 void doFind(const Stmt &root);
152
153 const auto &reads() const { return reads_; }
154 const auto &writes() const { return writes_; }
155 const auto &scope2coord() const { return scope2coord_; }
156
157 private:
158 template <class T> void visitStoreLike(const T &op) {
160
161 bool isThisVarDef = false;
162 VarDef viewOf;
163 if (def(op->var_)->id() == vardef_) {
164 isThisVarDef = true;
165 } else {
166 for (auto source = def(op->var_); source->viewOf_.has_value();) {
167 source = def(*source->viewOf_);
168 if (source->id() == vardef_) {
169 isThisVarDef = true;
170 viewOf = source;
171 break;
172 }
173 }
174 }
175 if (!isThisVarDef) {
176 return;
177 }
178
179 std::vector<Expr> exprs;
180 VarDef d;
181 if (viewOf.isValid()) {
182 // Simultaneously access of a `VarDef` and the `VarDef` it views is
183 // ALWAYS treated as dependences. Use Intrinsic as "any expression"
184 // FIXME: This may cause problems if we want the presburger
185 // expression from the `found_` callback. If `a[i]` is dependent on
186 // `a[any]`, we want `i` to be really anything, instead of `i ==
187 // this_intrin`
188 exprs = std::vector<Expr>(
189 viewOf->buffer_->tensor()->shape().size(),
190 makeIntrinsic("", {}, DataType::Int32, false));
191 d = viewOf;
192 } else {
193 exprs = op->indices_;
194 d = def(op->var_);
195 }
196
197 auto ap = Ref<AccessPoint>::make(op, curStmt(), d, d->buffer_);
198 if (accFilter_ == nullptr || accFilter_(*ap)) {
199 if (!cur_.empty() &&
200 cur_.back().iter_->nodeType() == ASTNodeType::IntConst) {
201 // top is band node
202 cur_.back().iter_ = makeIntConst(
203 cur_.back().iter_.as<IntConstNode>()->val_ + 1);
204 }
205 lastIsLoad_ = false;
206
207 ap->addCoord(defAxis_, cur_, std::move(exprs), conds_);
208 writes_.emplace_back(ap);
209 }
210 }
211
212 protected:
213 void visit(const VarDef &op) override;
214 void visit(const StmtSeq &op) override;
215 void visit(const For &op) override;
216 void visit(const If &op) override;
217 void visit(const Assert &op) override;
218 void visit(const Store &op) override { visitStoreLike(op); }
219 void visit(const ReduceTo &op) override { visitStoreLike(op); }
220 void visit(const Load &op) override;
221 void visit(const MatMul &op) override { (*this)(op->equivalent_); }
222};
223
224enum class DepDirection : int {
225 Normal,
226 Inv,
227 Same,
228 Different,
229};
230
235
236 NodeIDOrParallelScope(const ID &id) : id_(id), isNode_(true) {}
238 : parallel_(parallel), isNode_(false) {}
239};
240
241typedef std::vector<std::pair<NodeIDOrParallelScope, DepDirection>> FindDepsDir;
242
243class AnalyzeDeps;
244
247 const std::string &var_;
250
251 // Some raw presburger objects. Note that the iteration space follows
252 // temporal order, and an iterator `i` becomes `-i` when the loop traverses
253 // reversedly
256 // not only counting the nearest, but all
260
261 // Helper functions
262 const AST &later() const { return later_.op_; }
263 const AST &earlier() const { return earlier_.op_; }
264 const VarDef &def() const { return earlier_.def_; }
265 ID defId() const { return earlier_.def_->id(); }
266
267 // Additional condition check. This check is not multi-thread, so please use
268 // the `cond` parameter of `findDeps` instead, if possible
269 PBMap extraCheck(PBMap dep, const NodeIDOrParallelScope &nodeOrParallel,
270 const DepDirection &dir) const;
271};
272
273typedef SyncFunc<void(const Dependence &)> FindDepsCallback;
274
275enum class FindDepsMode : int {
276 Dep, // Dependence may happen between `earlier` and `later`
277 KillEarlier, // At any point in the space of `earlier`, it is dependent by
278 // `later`
279 KillLater, // At any point in the space of `later`, it is depending on
280 // `earlier`
281 KillBoth, // KillEarlier + KillLater
282};
283
288 friend Dependence;
289
290 std::vector<Ref<AccessPoint>> readsAsEarlier_, readsAsLater_,
291 writesAsEarlier_, writesAsLater_;
292 const std::unordered_map<ID, std::vector<IterAxis>> &scope2coord_;
293 const std::unordered_map<std::string, std::vector<ID>>
294 &noDepsLists_; // Var name -> [loop ID]
295 Lazy<LoopVariExprMap> &variantExpr_;
296
297 const std::vector<FindDepsDir> &direction_;
298 const FindDepsCallback &found_;
299 const FindDepsAccPtFilter &earlierFilter_, &laterFilter_;
300 const FindDepsFilter &filter_;
301
302 const FindDepsMode mode_;
303 const DepType depType_;
304 const bool ignoreReductionWAW_;
305 const bool eraseOutsideVarDef_;
306 const bool noProjectOutPrivateAxis_;
307
308 std::vector<std::function<void()>> tasks_;
309
310 public:
312 const std::vector<Ref<AccessPoint>> &reads,
313 const std::vector<Ref<AccessPoint>> &writes,
314 const std::unordered_map<ID, std::vector<IterAxis>> &scope2coord,
315 const std::unordered_map<std::string, std::vector<ID>> &noDepsLists,
316 Lazy<LoopVariExprMap> &variantExpr,
317 const std::vector<FindDepsDir> &direction,
318 const FindDepsCallback &found, FindDepsMode mode, DepType depType,
319 const FindDepsAccPtFilter &earlierFilter,
320 const FindDepsAccPtFilter &laterFilter, const FindDepsFilter &filter,
321 bool ignoreReductionWAW, bool eraseOutsideVarDef,
322 bool noProjectOutPrivateAxis)
323 : scope2coord_(scope2coord), noDepsLists_(noDepsLists),
324 variantExpr_(variantExpr), direction_(direction), found_(found),
325 earlierFilter_(earlierFilter), laterFilter_(laterFilter),
326 filter_(filter), mode_(mode), depType_(depType),
327 ignoreReductionWAW_(ignoreReductionWAW),
328 eraseOutsideVarDef_(eraseOutsideVarDef),
329 noProjectOutPrivateAxis_(noProjectOutPrivateAxis) {
330 readsAsEarlier_ =
331 ::freetensor::filter(reads, [&](const Ref<AccessPoint> &acc) {
332 return (depType_ & DEP_WAR) &&
333 (earlierFilter_ == nullptr || earlierFilter_(*acc));
334 });
335 readsAsLater_ =
336 ::freetensor::filter(reads, [&](const Ref<AccessPoint> &acc) {
337 return (depType_ & DEP_RAW) &&
338 (laterFilter_ == nullptr || laterFilter_(*acc));
339 });
340 writesAsEarlier_ =
341 ::freetensor::filter(writes, [&](const Ref<AccessPoint> &acc) {
342 return earlierFilter_ == nullptr || earlierFilter_(*acc);
343 });
344 writesAsLater_ =
345 ::freetensor::filter(writes, [&](const Ref<AccessPoint> &acc) {
346 return laterFilter_ == nullptr || laterFilter_(*acc);
347 });
348 }
349
350 void genTasks();
351
352 const std::vector<std::function<void()>> &tasks() const { return tasks_; }
353
354 public:
355 static std::string makeIterList(const std::vector<IterAxis> &list, int n);
356 static std::string makeNegIterMap(const std::vector<IterAxis> &list, int n);
357 static std::string makeNdList(const std::string &name, int n);
358 static std::vector<
359 std::pair<std::string /* list */, std::string /* cond */>>
360 makeAccList(GenPBExpr &genPBExpr, const std::vector<Expr> &list,
361 GenPBExpr::VarMap &externals);
362 static std::string makeCond(GenPBExpr &genPBExpr,
363 GenPBExpr::VarMap &externals,
364 bool eraseOutsideVarDef, const AccessPoint &ap);
365 static PBMap makeAccMapStatic(const Ref<PBCtx> &presburger,
366 const AccessPoint &p, int iterDim, int accDim,
367 const std::string &extSuffix,
368 GenPBExpr::VarMap &externals,
369 const ASTHashSet<Expr> &noNeedToBeVars,
370 bool eraseOutsideVarDef);
371
372 private:
373 PBMap makeAccMap(const Ref<PBCtx> &presburger, const AccessPoint &p,
374 int iterDim, int accDim, const std::string &extSuffix,
375 GenPBExpr::VarMap &externals,
376 const ASTHashSet<Expr> &noNeedToBeVars) {
377 return makeAccMapStatic(presburger, p, iterDim, accDim, extSuffix,
378 externals, noNeedToBeVars, eraseOutsideVarDef_);
379 }
380
381 PBMap makeEqForBothOps(const Ref<PBCtx> &presburger,
382 const std::vector<std::pair<int, int>> &coord,
383 int iterDim) const;
384 PBMap makeIneqBetweenOps(const Ref<PBCtx> &presburger, DepDirection mode,
385 int iterId, int iterDim) const;
386
387 PBMap makeSerialToAll(const Ref<PBCtx> &presburger, int iterDim,
388 const std::vector<IterAxis> &point) const;
389 static int countSerial(const std::vector<IterAxis> &point);
390
391 PBMap makeExternalEq(const Ref<PBCtx> &presburger, int iterDim,
392 const std::string &ext1, const std::string &ext2);
393
394 PBMap makeConstraintOfSingleLoop(const Ref<PBCtx> &presburger,
395 const ID &loop, DepDirection mode,
396 int iterDim);
397
398 PBMap makeConstraintOfParallelScope(const Ref<PBCtx> &presburger,
399 const ParallelScope &parallel,
400 DepDirection mode, int iterDim,
401 const AccessPoint &later,
402 const AccessPoint &earlier);
403
418 PBMap makeEraseVarDefConstraint(const Ref<PBCtx> &presburger,
419 const Ref<AccessPoint> &point, int iterDim);
420
424 PBMap makeNoDepsConstraint(const Ref<PBCtx> &presburger,
425 const std::string &var, int iterDim);
426
441 PBMap makeExternalVarConstraint(const Ref<PBCtx> &presburger,
442 const Ref<AccessPoint> &later,
443 const Ref<AccessPoint> &earlier,
444 const GenPBExpr::VarMap &laterExternals,
445 const GenPBExpr::VarMap &earlierExternals,
446 int iterDim);
447
463 PBMap projectOutPrivateAxis(const Ref<PBCtx> &presburger, int iterDim,
464 int since);
465 void projectOutPrivateAxis(const Ref<PBCtx> &presburger,
466 const Ref<AccessPoint> &point,
467 const std::vector<Ref<AccessPoint>> &otherList,
468 std::vector<PBMap> &otherMapList, int iterDim);
469 int numCommonDims(const Ref<AccessPoint> &p1, const Ref<AccessPoint> &p2);
470
471 void checkAgainstCond(const Ref<AccessPoint> &later,
472 const Ref<AccessPoint> &earlier, const PBMap &depAll,
473 const PBMap &nearest, const PBMap &laterMap,
474 const PBMap &earlierMap, const PBMap &extConstraint,
475 int iterDim);
476
477 static const std::string &getVar(const AST &op);
478
486 void
487 checkDepLatestEarlier(const Ref<AccessPoint> &later,
488 const std::vector<Ref<AccessPoint>> &earlierList);
489 void
490 checkDepLatestEarlierImpl(const Ref<PBCtx> &presburger,
491 const Ref<AccessPoint> &later,
492 const std::vector<Ref<AccessPoint>> &earlierList);
493
501 void checkDepEarliestLater(const std::vector<Ref<AccessPoint>> &laterList,
502 const Ref<AccessPoint> &earlier);
503 void
504 checkDepEarliestLaterImpl(const Ref<PBCtx> &presburger,
505 const std::vector<Ref<AccessPoint>> &laterList,
506 const Ref<AccessPoint> &earlier);
507};
508
515class FindDeps {
517 DepType type_ = DEP_ALL;
518 std::vector<FindDepsDir> direction_ = {{}};
519 FindDepsAccFilter accFilter_ = nullptr;
520 FindDepsAccPtFilter earlierFilter_ = nullptr;
521 FindDepsAccPtFilter laterFilter_ = nullptr;
522 FindDepsFilter filter_ = nullptr;
523 std::function<void(const ID &,
524 const std::unordered_map<ID, std::vector<IterAxis>> &)>
525 scope2CoordCallback_ = nullptr;
526 bool ignoreReductionWAW_ = true;
527 bool eraseOutsideVarDef_ = true;
528 bool noProjectOutPrivateAxis_ = false;
529
530 public:
550 FindDeps ret = *this;
551 ret.mode_ = m;
552 return ret;
553 }
554
561 FindDeps ret = *this;
562 ret.type_ = t;
563 return ret;
564 }
565
580 FindDeps direction(const std::vector<FindDepsDir> &d) {
581 FindDeps ret = *this;
582 ret.direction_ = d;
583 return ret;
584 }
585
600 filterAccess(const std::function<bool(const AccessPointBase &)> &f) {
601 return filterAccess(syncFunc(f));
602 }
604 FindDeps ret = *this;
605 ret.accFilter_ = ret.accFilter_ == nullptr
606 ? f
607 : unsyncFunc([f0 = ret.accFilter_,
608 f1 = f](const AccessPointBase &acc) {
609 return f0(acc) && f1(acc);
610 });
611 return ret;
612 }
624 FindDeps ret = *this;
625 ret.earlierFilter_ =
626 ret.earlierFilter_ == nullptr
627 ? f
628 : [f0 = ret.earlierFilter_, f1 = f](const AccessPoint &acc) {
629 return f0(acc) && f1(acc);
630 };
631 return ret;
632 }
633
643 FindDeps ret = *this;
644 ret.laterFilter_ =
645 ret.laterFilter_ == nullptr
646 ? f
647 : [f0 = ret.laterFilter_, f1 = f](const AccessPoint &acc) {
648 return f0(acc) && f1(acc);
649 };
650 return ret;
651 }
652
662 FindDeps ret = *this;
663 ret.filter_ = f;
664 ret.filter_ =
665 ret.filter_ == nullptr
666 ? f
667 : [f0 = ret.filter_, f1 = f](const AccessPoint &later,
668 const AccessPoint &earlier) {
669 return f0(later, earlier) && f1(later, earlier);
670 };
671 return ret;
672 }
673
677 FindDeps filterSubAST(const ID &subAST) {
678 return filterAccess([subAST](const AccessPointBase &acc) {
679 return acc.stmt_->ancestorById(subAST).isValid();
680 });
681 }
682
690 FindDeps ret = *this;
691 ret.ignoreReductionWAW_ = flag;
692 return ret;
693 }
694
701 FindDeps ret = *this;
702 ret.eraseOutsideVarDef_ = flag;
703 return ret;
704 }
705
714 FindDeps ret = *this;
715 ret.noProjectOutPrivateAxis_ = flag;
716 return ret;
717 }
718
720 std::function<void(
721 const ID &, const std::unordered_map<ID, std::vector<IterAxis>> &)>
722 callback) {
723 FindDeps ret = *this;
724 ret.scope2CoordCallback_ = callback;
725 return ret;
726 }
727
734 void operator()(const Stmt &op,
735 const std::function<void(const Dependence &)> &found) {
736 (*this)(op, syncFunc(found));
737 }
738
745 void operator()(const Stmt &op, const FindDepsCallback &found);
746
755 bool exists(const Stmt &op);
756};
757
758std::ostream &operator<<(std::ostream &os, const Dependence &dep);
759
760}; // namespace freetensor
761
762#endif // FREE_TENSOR_DEPS_H
Definition: deps.h:287
void genTasks()
Definition: deps.cc:1269
AnalyzeDeps(const std::vector< Ref< AccessPoint > > &reads, const std::vector< Ref< AccessPoint > > &writes, const std::unordered_map< ID, std::vector< IterAxis > > &scope2coord, const std::unordered_map< std::string, std::vector< ID > > &noDepsLists, Lazy< LoopVariExprMap > &variantExpr, const std::vector< FindDepsDir > &direction, const FindDepsCallback &found, FindDepsMode mode, DepType depType, const FindDepsAccPtFilter &earlierFilter, const FindDepsAccPtFilter &laterFilter, const FindDepsFilter &filter, bool ignoreReductionWAW, bool eraseOutsideVarDef, bool noProjectOutPrivateAxis)
Definition: deps.h:311
static std::vector< std::pair< std::string, std::string > > makeAccList(GenPBExpr &genPBExpr, const std::vector< Expr > &list, GenPBExpr::VarMap &externals)
Definition: deps.cc:315
static std::string makeCond(GenPBExpr &genPBExpr, GenPBExpr::VarMap &externals, bool eraseOutsideVarDef, const AccessPoint &ap)
Definition: deps.cc:346
static std::string makeNegIterMap(const std::vector< IterAxis > &list, int n)
Definition: deps.cc:296
const std::vector< std::function< void()> > & tasks() const
Definition: deps.h:352
static std::string makeNdList(const std::string &name, int n)
Definition: deps.cc:475
static std::string makeIterList(const std::vector< IterAxis > &list, int n)
Definition: deps.cc:274
static PBMap makeAccMapStatic(const Ref< PBCtx > &presburger, const AccessPoint &p, int iterDim, int accDim, const std::string &extSuffix, GenPBExpr::VarMap &externals, const ASTHashSet< Expr > &noNeedToBeVars, bool eraseOutsideVarDef)
Definition: deps.cc:437
static constexpr auto Int32
Definition: data_type.h:128
Definition: deps.h:100
void visit(const VarDef &op) override
Definition: deps.cc:90
void visit(const MatMul &op) override
Definition: deps.h:221
void visit(const Store &op) override
Definition: deps.h:218
void doFind(const Stmt &root)
Definition: deps.cc:30
void visit(const ReduceTo &op) override
Definition: deps.h:219
const auto & writes() const
Definition: deps.h:154
const auto & reads() const
Definition: deps.h:153
const auto & scope2coord() const
Definition: deps.h:155
Definition: deps.h:67
const std::unordered_map< std::string, std::vector< ID > > & results() const
Definition: deps.h:77
void visit(const For &op) override
Definition: deps.cc:19
Definition: deps.h:515
FindDeps noProjectOutPrivateAxis(bool flag)
Definition: deps.h:713
FindDeps eraseOutsideVarDef(bool flag)
Definition: deps.h:700
bool exists(const Stmt &op)
Definition: deps.cc:1392
FindDeps filterEarlier(const FindDepsAccPtFilter &f)
Definition: deps.h:623
FindDeps scope2CoordCallback(std::function< void(const ID &, const std::unordered_map< ID, std::vector< IterAxis > > &)> callback)
Definition: deps.h:719
FindDeps type(DepType t)
Definition: deps.h:560
FindDeps mode(FindDepsMode m)
Definition: deps.h:549
FindDeps filterSubAST(const ID &subAST)
Definition: deps.h:677
FindDeps direction(const std::vector< FindDepsDir > &d)
Definition: deps.h:580
FindDeps filterAccess(const FindDepsAccFilter &f)
Definition: deps.h:603
FindDeps filterLater(const FindDepsAccPtFilter &f)
Definition: deps.h:642
FindDeps filterAccess(const std::function< bool(const AccessPointBase &)> &f)
Definition: deps.h:600
FindDeps ignoreReductionWAW(bool flag)
Definition: deps.h:689
FindDeps filter(const FindDepsFilter &f)
Definition: deps.h:661
void operator()(const Stmt &op, const std::function< void(const Dependence &)> &found)
Definition: deps.h:734
Definition: gen_pb_expr.h:34
ASTHashMap< Expr, std::string > VarMap
Definition: gen_pb_expr.h:37
Definition: id.h:18
Definition: lazy.h:12
Definition: presburger.h:75
static Ref make()
Definition: ref.h:105
bool isValid() const
Definition: ref.h:89
Ref< StmtNode > ancestorById(const ID &lookup) const
Definition: ast.cc:279
ID id() const
Definition: ast.cc:362
Definition: symbol_table.h:122
BaseClass::StmtRetType visit(const VarDef &op) override
Definition: symbol_table.h:167
const VarDef & def(const std::string &name) const override
Definition: symbol_table.h:142
Definition: sync_func.h:16
const Stmt & curStmt() const
Definition: track_stmt.h:31
SubTree< Buffer > buffer_
Definition: stmt.h:86
std::optional< std::string > viewOf_
Definition: stmt.h:99
Definition: visitor.h:11
int n
Definition: metadata.cc:15
Definition: allocator.h:9
detail::TaggedSyncFunc< std::remove_reference_t< T > > syncFunc(T &&f)
Definition: sync_func.h:76
std::function< bool(const AccessPoint &later, const AccessPoint &earlier)> FindDepsFilter
Definition: deps.h:89
int DepType
Definition: deps.h:91
Ref< VarDefNode > VarDef
Definition: stmt.h:107
Expr makeIntrinsic(const std::string &format, T &&params, DataType retType, bool hasSideEffect, std::source_location loc=std::source_location::current())
Definition: expr.h:756
std::function< bool(const AccessPoint &)> FindDepsAccPtFilter
Definition: deps.h:86
SyncFunc< void(const Dependence &)> FindDepsCallback
Definition: deps.h:273
Ref< IfNode > If
Definition: stmt.h:352
Ref< ForNode > For
Definition: stmt.h:308
std::vector< T > filter(const std::vector< T > &vec, const U &callback)
Definition: container_utils.h:131
std::vector< std::pair< NodeIDOrParallelScope, DepDirection > > FindDepsDir
Definition: deps.h:241
Ref< ASTNode > AST
Definition: ast.h:149
std::variant< SerialScope, OpenMPScope, CUDAStreamScope, CUDAScope > ParallelScope
Definition: parallel_scope.h:73
const DepType DEP_RAW
Definition: deps.h:94
DepDirection
Definition: deps.h:224
const DepType DEP_WAR
Definition: deps.h:93
FindDepsMode
Definition: deps.h:275
const DepType DEP_ALL
Definition: deps.h:95
constexpr ParallelScope serialScope
Definition: parallel_scope.h:112
SyncFunc< bool(const AccessPointBase &)> FindDepsAccFilter
Definition: deps.h:85
std::ostream & operator<<(std::ostream &os, const Dependence &dep)
Definition: deps.cc:1404
Expr makeIntConst(int64_t val, std::source_location loc=std::source_location::current())
Definition: expr.h:102
Ref< AssertNode > Assert
Definition: stmt.h:392
std::unordered_set< K, Hasher, HashComparator > ASTHashSet
Definition: hash.h:117
detail::TaggedUnsyncFunc< std::remove_reference_t< T > > unsyncFunc(T &&f)
Definition: sync_func.h:84
Ref< StmtSeqNode > StmtSeq
Definition: stmt.h:49
const DepType DEP_WAW
Definition: deps.h:92
Definition: deps.h:36
Ref< Buffer > buffer_
Definition: deps.h:40
AccessPointBase(const AST &op, const Stmt &stmt, const VarDef &def, const Ref< Buffer > &buffer)
Definition: deps.h:42
VarDef def_
Definition: deps.h:39
Stmt stmt_
Definition: deps.h:38
AST op_
Definition: deps.h:37
Definition: deps.h:47
AccessPoint(const AST &op, const Stmt &stmt, const VarDef &def, const Ref< Buffer > &buffer)
Definition: deps.h:55
std::vector< Expr > access_
The temporal location of the access.
Definition: deps.h:50
void addCoord(int defAxis, auto &&iter, auto &&access, auto &&conds)
Definition: deps.h:59
std::vector< IterAxis > iter_
The position of the VarDef.
Definition: deps.h:49
int defAxis_
Definition: deps.h:48
std::vector< std::pair< Expr, ID > > conds_
The spatial location of the access.
Definition: deps.h:52
Definition: deps.h:245
const AST & later() const
Definition: deps.h:262
const FindDepsDir & dir_
Definition: deps.h:246
const std::string & var_
Direction vector filtering out this dependence.
Definition: deps.h:247
PBMap earlierIter2Idx_
Definition: deps.h:255
const VarDef & def() const
Definition: deps.h:264
PBMap laterIter2Idx_
Definition: deps.h:255
ID defId() const
Definition: deps.h:265
PBMap later2EarlierIter_
Definition: deps.h:254
const AccessPoint & later_
Definition: deps.h:248
const AST & earlier() const
Definition: deps.h:263
int iterDim_
Definition: deps.h:249
PBMap extConstraint_
Definition: deps.h:258
PBMap later2EarlierIterAllPossible_
Definition: deps.h:257
PBMap extraCheck(PBMap dep, const NodeIDOrParallelScope &nodeOrParallel, const DepDirection &dir) const
Definition: deps.cc:1312
AnalyzeDeps & self_
Definition: deps.h:259
const AccessPoint & earlier_
Definition: deps.h:248
Definition: deps.h:26
bool negStep_
Definition: deps.h:29
IterAxis(Expr iter, const ParallelScope &parallel=serialScope, bool negStep=false)
Definition: deps.h:31
ParallelScope parallel_
Definition: deps.h:28
Expr iter_
Definition: deps.h:27
Definition: deps.h:231
ID id_
Definition: deps.h:232
ParallelScope parallel_
Definition: deps.h:233
NodeIDOrParallelScope(const ParallelScope &parallel)
Definition: deps.h:237
bool isNode_
Definition: deps.h:234
NodeIDOrParallelScope(const ID &id)
Definition: deps.h:236