1#ifndef FREE_TENSOR_SCHEDULE_LOG_H
2#define FREE_TENSOR_SCHEDULE_LOG_H
48 "split",
"reorder",
"merge",
49 "fission",
"fuse",
"swap",
50 "blend",
"cache",
"cache_reduction",
51 "set_mem_type",
"var_split",
"var_merge",
52 "var_reorder",
"var_unsqueeze",
"var_squeeze",
53 "inline",
"parallelize",
"parallelize_as",
54 "unroll",
"vectorize",
"separate_tail",
55 "as_matmul",
"permute",
"pluto_fuse",
80 virtual size_t hash()
const = 0;
82 virtual void run() = 0;
89 return os << pack.first <<
"(" << pack.second <<
")";
92template <
typename... Args>
94 auto f = [&](
auto &&arg) {
95 if constexpr (std::is_same_v<std::decay_t<
decltype(arg)>,
98 else if constexpr (std::is_same_v<std::decay_t<
decltype(arg)>,
99 std::vector<IDMetadataPack>>) {
101 arg | views::transform([&](
auto pack) {
return pack.first; });
102 return std::vector<ID>(ids.begin(), ids.end());
107 [&](
auto &&...args) {
return std::make_tuple(f(args)...); }, args);
110template <
typename... Args>
112 auto f = [&](
auto &&arg) {
113 if constexpr (std::is_same_v<std::decay_t<
decltype(arg)>,
116 else if constexpr (std::is_same_v<std::decay_t<
decltype(arg)>,
117 std::vector<IDMetadataPack>>) {
119 arg | views::transform([&](
auto pack) {
return pack.second; });
120 return std::vector<Metadata>(metas.begin(), metas.end());
125 [&](
auto &&...args) {
return std::make_tuple(f(args)...); }, args);
128template <
typename... Args>
130 auto f = [&](
auto &&arg) {
131 if constexpr (std::is_same_v<std::decay_t<
decltype(arg)>,
ID>)
133 else if constexpr (std::is_same_v<std::decay_t<
decltype(arg)>,
136 arg | views::transform([&](
auto id) {
139 return std::vector<IDMetadataPack>(packs.begin(), packs.end());
144 [&](
auto &&...args) {
return std::make_tuple(f(args)...); }, args);
153template <ScheduleType TYPE,
class _Invocable,
class _Params,
class _Result>
163 std::variant<std::nullopt_t, Result, std::exception_ptr>
result_ =
174 std::ostringstream os;
175 os << std::boolalpha <<
type() <<
'(' <<
params_ <<
')';
180 std::ostringstream os;
188 return std::hash<decltype(idParams)>()(idParams);
202 std::lock_guard<std::mutex> guard(
lock_);
203 if (std::holds_alternative<std::nullopt_t>(
result_)) {
207 result_ = std::current_exception();
216 if (std::holds_alternative<std::nullopt_t>(
result_)) {
217 ERROR(
"BUG: The schedule log is not run yet");
218 }
else if (std::holds_alternative<Result>(
result_)) {
219 return std::get<Result>(
result_);
222 std::rethrow_exception(std::get<std::exception_ptr>(
result_));
227 if (std::holds_alternative<std::nullopt_t>(
result_)) {
228 ERROR(
"The schedule log is not run yet");
229 }
else if (std::holds_alternative<Result>(
result_)) {
231 if constexpr (std::derived_from<Result, Stmt>) {
234 return std::get<0>(result);
259typedef SharedLinkedList<Ref<ScheduleLogItem>, ScheduleLogItemHash,
260 ScheduleLogItemEqual>
267#define MAKE_SCHEDULE_LOG(TYPE, FUNC, ...) \
268 ([this](const auto &func, const auto &_params) { \
269 auto params = getPackFromID(this, _params); \
271 typedef ScheduleLogItemImpl< \
272 ScheduleType::TYPE, std::decay_t<decltype(func)>, \
273 std::decay_t<decltype(params)>, \
274 std::decay_t<decltype(std::apply(func, _params))>> \
276 class ScheduleLogItem##TYPE : public BaseClass { \
278 ScheduleLogItem##TYPE(const typename BaseClass::Invocable &f, \
279 const typename BaseClass::Params &p) \
280 : BaseClass(f, p) {} \
282 return Ref<ScheduleLogItem##TYPE>::make(func, params); \
283 })(futureSchedule(FUNC), std::make_tuple(__VA_ARGS__))
Definition: as_matmul.h:56
Definition: parallelize.h:11
Definition: permute.cc:15
Definition: schedule_log.h:154
std::mutex lock_
Definition: schedule_log.h:165
size_t hash() const override
Definition: schedule_log.h:186
bool equals(const ScheduleLogItem &other) const override
Definition: schedule_log.h:191
Stmt resultAST() const override final
Definition: schedule_log.h:226
void run() override
Definition: schedule_log.h:201
_Params Params
Definition: schedule_log.h:158
_Result Result
Definition: schedule_log.h:159
std::variant< std::nullopt_t, Result, std::exception_ptr > result_
Definition: schedule_log.h:163
std::string toPrettyString() const override
Definition: schedule_log.h:179
ScheduleType type() const override
Definition: schedule_log.h:171
Result getResult() const
Definition: schedule_log.h:215
Invocable doSchedule_
Definition: schedule_log.h:161
_Invocable Invocable
Definition: schedule_log.h:157
ScheduleLogItemImpl(const Invocable &doSchedule, const Params ¶ms)
Definition: schedule_log.h:168
Params params_
Definition: schedule_log.h:162
std::string toString() const override
Definition: schedule_log.h:173
Definition: schedule_log.h:74
virtual std::string toPrettyString() const =0
virtual std::string toString() const =0
virtual Stmt resultAST() const =0
virtual size_t hash() const =0
virtual bool equals(const ScheduleLogItem &other) const =0
virtual ~ScheduleLogItem()
Definition: schedule_log.h:76
virtual ScheduleType type() const =0
Definition: separate_tail.h:53
Definition: set_mem_type.h:52
Definition: var_merge.h:8
Definition: var_reorder.h:11
Definition: var_split.h:10
Definition: vectorize.h:8
#define ASSERT(expr)
Definition: except.h:152
#define ERROR(msg)
Definition: except.h:141
Definition: allocator.h:9
auto getMetadataFromPack(const std::tuple< Args... > &args)
Definition: schedule_log.h:111
auto && lhs
Definition: const_fold.cc:70
auto getIDFromPack(const std::tuple< Args... > &args)
Definition: schedule_log.h:93
PBSet params(T &&set)
Definition: presburger.h:1065
SharedLinkedList< Ref< ScheduleLogItem >, ScheduleLogItemHash, ScheduleLogItemEqual > ScheduleLog
Definition: schedule_log.h:261
constexpr std::array scheduleTypeNames
Definition: schedule_log.h:47
std::pair< ID, Metadata > IDMetadataPack
Definition: schedule_log.h:86
auto getPackFromID(auto schedule, const std::tuple< Args... > &args)
Definition: schedule_log.h:129
auto auto && rhs
Definition: const_fold.cc:70
ScheduleType
Definition: schedule_log.h:17
std::ostream & operator<<(std::ostream &os, const Dependence &dep)
Definition: deps.cc:1404
Definition: schedule_log.h:246
bool operator()(const Ref< ScheduleLogItem > &lhs, const Ref< ScheduleLogItem > &rhs) const
Definition: schedule_log.h:247
Definition: schedule_log.h:253
bool operator()(const Ref< ScheduleLogItem > &item) const
Definition: schedule_log.h:254