DefaultBlockSchedule

功能说明

默认的block层schedule调度策略,实现完全继承BaseBlockSchedule的能力,根据DefaultBlockConfig的切分参数配置,实现block层级的调度逻辑。

所属头文件链接

/include/elewise/block/schedule.h

函数原型

template <typename Compute, const auto& Policy, typename ScheduleCfg, typename ArchTag>
class DefaultBlockSchedule : public BaseBlockSchedule<Compute, Policy, ScheduleCfg, ArchTag>

参数说明

参数名称 参数类型 输入/输出 数据类型 参数说明 默认值
Compute 模板参数 输入 NA Tile层计算表达图对象类型,跟kernel层是被包含关系 NA
Policy 模板参数 输入 NA block层的用户静态策略类型 NA
ScheduleCfg 模板参数 输入 NA block层调度配置类型 NA
ArchTag 模板参数 输入 NA 用户配置的芯片版本型号 NA

返回值说明

返回值数据类型 返回值说明
DefaultBlockSchedule 返回默认的block层schedule调度策略

约束说明

NA

使用示例

template <typename InputDtype, typename OutputDtype>
struct AddSubConfig {
    struct AddSubCompute {
        template <template <typename> class Tensor>
        __host_aicore__ constexpr auto Compute() const
        {
            auto in1 = Atvoss::PlaceHolder<1, Tensor<InputDtype>, Atvoss::ParamUsage::IN>();
            auto in2 = Atvoss::PlaceHolder<2, Tensor<InputDtype>, Atvoss::ParamUsage::IN>();
            auto in3 = Atvoss::PlaceHolder<3, InputDtype, Atvoss::ParamUsage::IN>();
            auto out = Atvoss::PlaceHolder<4, Tensor<OutputDtype>, Atvoss::ParamUsage::OUT>();
            return (out = in1 + in2 - in3);
        };
    };

    static constexpr Atvoss::Ele::DefaultBlockPolicy<TileShape> blockPolicy{TileShape{}};
    using ArchTag = Atvoss::Arch::DAV_3510;
    using BlockOp = Atvoss::Ele::BlockBuilder<
      AddSubCompute, 
      ArchTag, 
      blockPolicy,
      Atvoss::Ele::DefaultBlockConfig, 

      // 🔥🔥🔥 使用示例 🔥🔥🔥
      Atvoss::Ele::DefaultBlockSchedule
      // 🔥🔥🔥 使用示例 🔥🔥🔥

      >;
    using KernelOp = Atvoss::Ele::KernelBuilder<BlockOp>;
    using DeviceOp = Atvoss::DeviceAdapter<KernelOp>;
};

template <typename InputDtype, typename OutputDtype>
static void Run() {
    /* ACL init and stream create */
    ...

    Atvoss::Tensor<InputDtype> in1(deviceIn1, {{3, 4, 0, 0, 0, 0, 0, 0}}, 2);
    Atvoss::Tensor<InputDtype> in2(deviceIn2, {{3, 4, 0, 0, 0, 0, 0, 0}}, 2);
    InputDtype in3 = 5.0;
    Atvoss::Tensor<OutputDtype> out(deviceOut, {{3, 4, 0, 0, 0, 0, 0, 0}}, 2);

    auto arguments = Atvoss::ArgumentsBuilder{}.inputOutput(in1, in2, in3, out).attr("dim", 5).build();

    using DeviceOp = typename AddSubConfig<InputDtype, OutputDtype>::DeviceOp;
    DeviceOp deviceOp;
    deviceOp.Run(arguments, stream);
}

int main(int argc, char const* argv[]) {
    Run<float, float>();
    return 0;
}