You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Adams和Mullapudi自动调度器是否支持特化的技术咨询

Halide自动调度器的数组大小适配问题与特化支持咨询

Adams和Mullapudi自动调度器生成的调度通常包含带常量参数的vectorize和split原语,这类调度无法适配编译后Halide库接收的所有数组大小,具体表现如下:

  • 使用vectorize(d1, 4)调度时,数组大小设为3会触发越界错误,设为4则运行正常;
  • 改用split(d1, d1, d2, 8)调度后,数组大小设为7触发越界错误,设为8则运行正常。

可见当数组尺寸与split/vectorize的参数不兼容时,会出现内存越界问题。若自动调度器能在生成的调度中添加特化逻辑,过滤掉不兼容的数组大小,即可解决该问题;将split/vectorize参数化也是一种思路,但可能并非最优方案。

现咨询:Mullapudi或Adams自动调度器是否支持此类场景的特化处理,或是已有支持该功能的计划?


SchBugGen.cpp代码

#include "Halide.h"
#include <stdio.h>
using namespace Halide;
class SchBugGen : public Halide::Generator <SchBugGen> {
    public:
        Input<Buffer<double>> aIn1{"aIn1", 1};
        Output<Buffer<double>> aOut1{"aOut1", 1};

        void generate() {
            aOut1(d1) = aIn1(d1) * 2;
        }

        void schedule() {
            Var d2("d2");
            // 默认调度
            aOut1.vectorize(d1, 4);
            // aOut1.split(d1, d1, d2, 8);
        }
    private:
        Var d1{"d1"};
};
HALIDE_REGISTER_GENERATOR(SchBugGen, SchBugGenerator)

bugRepro.cpp代码

#include <stdio.h>
#include <stdlib.h>
#include "schBugFun.h"
#include "HalideBuffer.h"

void printOut(double aOut1[], int aLen) {
    printf("Out = {");
    for (int i = 0; i < aLen; i++) {
        printf("%0.0lf ", aOut1[i]);
    }
    printf("}\n");
}

void initArrs(double aIn1[], int aIn1Size) {
    for (int i = 0; i < aIn1Size; i++) {
        aIn1[i] = 10;
    }
}

int main() {
    // 当向量化大小为4时,尝试fl=3(触发断言)和fl=4(正常)
    // 当split大小为8时,尝试fl=7(触发断言)和fl=8(正常)
    const int fl = 3;

    double in1[fl];
    double out1[fl] = {};
    initArrs(in1, fl);

    Halide::Runtime::Buffer<const double> inHBuff(in1, fl);
    Halide::Runtime::Buffer<double> outHBuff(out1, fl);

    schBugFun(inHBuff, outHBuff);
    printOut(out1, fl);   

    return 0;
}

编译与运行命令

1. 设置环境变量(仅需执行一次)

set PATH=<HALIDE_BIN_PATH>:$PATH
set LD_LIBRARY_PATH=<HALIDE_BIN_PATH>

2. 编译Halide生成器类

g++ -std=c++17 -g -I <HALIDE_INCLUDE_PATH> -L <HALIDE_BIN_PATH> -lHalide -lpthread -ldl -rdynamic -fno-rtti -Wl,-rpath,<HALIDE_BIN_PATH> SchBugGen.cpp <HALIDE_INCLUDE_PATH>/GenGen.cpp -o schBugLibGen

3. 运行生成器创建带调度的Halide库

./schBugLibGen -f schBugFun -g SchBugGenerator -e static_library,h,assembly,bitcode,cpp,html,cpp_stub,stmt,o,schedule target=host auto_schedule=false -o .

4. 编译测试程序

g++ -std=c++17 schBugFun.o -I <HALIDE_INCLUDE_PATH> -L <HALIDE_BIN_PATH> -lHalide -lpthread -ldl -rdynamic -fno-rtti -Wl,-rpath,<HALIDE_BIN_PATH> -O3 -g bugRepro.cpp -o out

5. 运行程序

./out

内容的提问来源于stack exchange,提问作者Ivan Garcia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 14:36:23