关于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
相关产品推荐
相关产品推荐

