如何使用不同的自动调度程序调度管道?

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' 了解其工作原理。