如何使用不同的自动调度程序调度管道?
how to schedule a pipeline with different auto scheduler?
我想测试不同的自动调度程序是如何工作的。我知道有 3 种不同的自动调度程序:"Mullapudi2016"(默认自动调度程序)、"Adams2019" 和 "Li2018"。 "Adams2019" 位于 apps/autoscheduler (https://github.com/halide/Halide),"Li2018" 位于 gradient_autoscheduler。但是我怎样才能在混凝土管道上使用一个(例如哈里斯)?我尝试在 Pipeline.cpp 中添加一张新地图,如下所示:
std::map<std::string, AutoSchedulerFn> &Pipeline::get_autoscheduler_map() {
static std::map<std::string, AutoSchedulerFn> autoschedulers = {
{ "Mullapudi2016", auto_schedule_Mullapudi2016 },
{ "Admas2019", auto_schedule_Adams2019 }
};
return autoschedulers;
}
"auto_schedule_Adams2019"的定义与"auto_schedule_Mullapudi2016"类似,只是将"generate_schedules"改为"generate_schedule","apps/autoscheduler/AutoSchedule.cpp"
void Pipeline::auto_schedule_Mullapudi2016(Pipeline pipeline, const Target &target,
const MachineParams &arch_params, AutoSchedulerResults *outputs) {
AutoSchedulerResults results;
results.target = target;
results.machine_params_string = arch_params.to_string();
user_assert(target.arch == Target::X86 || target.arch == Target::ARM ||
target.arch == Target::POWERPC || target.arch == Target::MIPS)
<< "The Mullapudi2016 autoscheduler is currently supported only on these architectures." << (int)target.arch;
results.scheduler_name = "Mullapudi2016";
results.schedule_source = generate_schedules(pipeline.contents->outputs, target, arch_params);
// this autoscheduler has no featurization
*outputs = results;
}
void Pipeline::auto_schedule_Adams2019(Pipeline pipeline, const Target &target,
const MachineParams &arch_params, AutoSchedulerResults *outputs) {
AutoSchedulerResults results;
results.target = target;
results.machine_params_string = arch_params.to_string();
user_assert(target.arch == Target::X86 || target.arch == Target::ARM ||
target.arch == Target::POWERPC || target.arch == Target::MIPS)
<< "The Mullapudi2016 autoscheduler is currently supported only on these architectures." << (int)target.arch;
results.scheduler_name = "Adams2019";
results.schedule_source = generate_schedule(pipeline.contents->outputs, target, arch_params);
// this autoscheduler has no featurization
*outputs = results;
}
理想情况下,当我在 harris 中调用 auto_schedule 时,我只需要提供一个调度程序名称即可。但是如何将项目 "harris" 与 "apps/autoscheduler" 中的自动调度程序 "Adams2019" 连接起来?我认为我需要 "auto_schedule.dll",它是由 auto_schedule.
编译的
但不幸的是我不知道如何将它连接到我的项目。有人遇到同样的问题,或者有人知道如何使用不同的自动调度程序吗?
将 -p 标志传递给生成器二进制文件使其加载插件。 Li 和 Adams 自动调度程序是作为插件构建的。生成器二进制文件的 -s 标志从已加载的自动调度程序中选择要使用的自动调度程序。 Mullapudi autoscheduler 不是插件,而是内置的,如您所说。
所有这些工作都是在 linux 和 mac 上完成的,所以我不确定是否所有构建系统部件都可以在 windows 上正常运行。如果您熟悉 makefile,请查看 apps/autoscheduler 中的 'make demo' 了解其工作原理。
我想测试不同的自动调度程序是如何工作的。我知道有 3 种不同的自动调度程序:"Mullapudi2016"(默认自动调度程序)、"Adams2019" 和 "Li2018"。 "Adams2019" 位于 apps/autoscheduler (https://github.com/halide/Halide),"Li2018" 位于 gradient_autoscheduler。但是我怎样才能在混凝土管道上使用一个(例如哈里斯)?我尝试在 Pipeline.cpp 中添加一张新地图,如下所示:
std::map<std::string, AutoSchedulerFn> &Pipeline::get_autoscheduler_map() {
static std::map<std::string, AutoSchedulerFn> autoschedulers = {
{ "Mullapudi2016", auto_schedule_Mullapudi2016 },
{ "Admas2019", auto_schedule_Adams2019 }
};
return autoschedulers;
}
"auto_schedule_Adams2019"的定义与"auto_schedule_Mullapudi2016"类似,只是将"generate_schedules"改为"generate_schedule","apps/autoscheduler/AutoSchedule.cpp"
void Pipeline::auto_schedule_Mullapudi2016(Pipeline pipeline, const Target &target,
const MachineParams &arch_params, AutoSchedulerResults *outputs) {
AutoSchedulerResults results;
results.target = target;
results.machine_params_string = arch_params.to_string();
user_assert(target.arch == Target::X86 || target.arch == Target::ARM ||
target.arch == Target::POWERPC || target.arch == Target::MIPS)
<< "The Mullapudi2016 autoscheduler is currently supported only on these architectures." << (int)target.arch;
results.scheduler_name = "Mullapudi2016";
results.schedule_source = generate_schedules(pipeline.contents->outputs, target, arch_params);
// this autoscheduler has no featurization
*outputs = results;
}
void Pipeline::auto_schedule_Adams2019(Pipeline pipeline, const Target &target,
const MachineParams &arch_params, AutoSchedulerResults *outputs) {
AutoSchedulerResults results;
results.target = target;
results.machine_params_string = arch_params.to_string();
user_assert(target.arch == Target::X86 || target.arch == Target::ARM ||
target.arch == Target::POWERPC || target.arch == Target::MIPS)
<< "The Mullapudi2016 autoscheduler is currently supported only on these architectures." << (int)target.arch;
results.scheduler_name = "Adams2019";
results.schedule_source = generate_schedule(pipeline.contents->outputs, target, arch_params);
// this autoscheduler has no featurization
*outputs = results;
}
理想情况下,当我在 harris 中调用 auto_schedule 时,我只需要提供一个调度程序名称即可。但是如何将项目 "harris" 与 "apps/autoscheduler" 中的自动调度程序 "Adams2019" 连接起来?我认为我需要 "auto_schedule.dll",它是由 auto_schedule.
编译的但不幸的是我不知道如何将它连接到我的项目。有人遇到同样的问题,或者有人知道如何使用不同的自动调度程序吗?
将 -p 标志传递给生成器二进制文件使其加载插件。 Li 和 Adams 自动调度程序是作为插件构建的。生成器二进制文件的 -s 标志从已加载的自动调度程序中选择要使用的自动调度程序。 Mullapudi autoscheduler 不是插件,而是内置的,如您所说。
所有这些工作都是在 linux 和 mac 上完成的,所以我不确定是否所有构建系统部件都可以在 windows 上正常运行。如果您熟悉 makefile,请查看 apps/autoscheduler 中的 'make demo' 了解其工作原理。