как запланировать конвейер с помощью другого автоматического планировщика?

Я хочу проверить, как работают разные автоматические планировщики. Я знаю, что есть 3 разных автоматических планировщика: «Mullapudi2016» (автоматический планировщик по умолчанию), «Adams2019» и «Li2018». "Adams2019" находится в apps/autoscheduler (https://github.com/halide/Halide) а «Li2018» находится в градиенте_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;
}

В идеале, когда я вызываю auto_schedule в harris, мне просто нужно указать имя планировщика. Но как связать проект "harris" с автопланировщиком "Adams2019" в "apps/autoscheduler"? Я думаю, что мне нужна "auto_schedule.dll", которая компилируется программой auto_schedule.

введите здесь описание изображения

Но, к сожалению, я не знаю, как подключить его к моему проекту. У кого-нибудь есть такая же проблема, или кто-то знает, как использовать разные автопланировщики?


person WJ SHI    schedule 05.12.2019    source источник


Ответы (1)


Передача флага -p бинарному файлу генератора заставляет его загрузить плагин. Автопланировщики Li и Adams построены как плагины. Флаг -s в двоичном файле генератора выбирает, какой автопланировщик использовать из тех, которые были загружены. Автопланировщик Mullapudi — это не плагин, а встроенный, как вы говорите.

Вся эта работа была проделана на Linux и Mac, поэтому я не уверен, есть ли все части системы сборки, чтобы это хорошо работало на Windows. Если вам удобно работать с make-файлами, взгляните на make demo в apps/autoscheduler, чтобы увидеть, как все работает.

person Andrew Adams    schedule 06.12.2019