Halide Generator输入Buffer被意外修改的解决方法咨询
解决Halide Generator中输入Buffer被意外修改的问题
问题描述
我编写了一个Yuv422Decoder的Halide Generator,输入输出均为2D uint8_t Buffer,算法通过mux索引输入通道生成输出。运行后主程序传入的输入Buffer被意外修改,尝试用中间Func转发输入、在generate阶段调用realize复制输入都没解决,后者还触发了Unhandled exception: Error: Buffer argument input is nullptr异常。
解决方案
1. 标记输入Buffer为只读
在Generator定义Input时,添加set_flags(Input::Flags::Readonly),明确告知Halide该输入是只读资源,编译器会直接禁止任何对输入Buffer的写入操作,从根源避免意外修改:
Input<Buffer<uint8_t>> input{"input", 2}.set_flags(Input::Flags::Readonly);
2. 确保输入输出Buffer无内存重叠
主程序中传入的输入和输出Buffer必须是完全独立的内存区域,不能有地址重叠。如果两者共享部分内存,哪怕算法逻辑上是只读输入,输出的写入操作也可能覆盖输入数据。
3. 正确复制输入Buffer(主程序中操作)
不要在Generator的generate或schedule阶段调用realize——此时输入还未绑定实际内存,必然报错。正确做法是在主程序中先复制输入Buffer,再将复制后的Buffer传入Generator:
// 主程序代码示例 Halide::Buffer<uint8_t> input_orig = ...; // 原始输入Buffer // 复制输入到新的独立Buffer Halide::Buffer<uint8_t> input_copy(input_orig.width(), input_orig.height()); Halide::copy(input_orig, input_copy); // 调用Generator处理复制后的输入 yuv422decoder(input_copy, output);
4. 检查调度逻辑
确认schedule中没有将输入Buffer作为输出的存储载体(比如output.store_in(input)这类操作),你的现有schedule不存在这个问题,但后续修改时需要留意。
修改后的完整Generator代码
#include "Halide.h" using namespace Halide; class Yuv422Decoder : public Halide::Generator<Yuv422Decoder> { public: // 标记输入为只读 Input<Buffer<uint8_t>> input{"input", 2}.set_flags(Input::Flags::Readonly); Output<Buffer<uint8_t>> output{"output", 2}; Var c,x,xo,xi,co,ci; void generate() { Func decode; Func in; in(c,x) = input(c,x); decode(c,x) = Halide::cast<uint8_t> (in(mux(c, {1,0,2,3,0,2}), x)); output(c,x) = decode(c,x); } void schedule() { output.bound_extent(c,6); output.split(x, xo, xi, input.dim(1).extent()/8); output.parallel(xo,2); output.parallel(xi,2); output.unroll(c); output.vectorize(xi,128); } }; HALIDE_REGISTER_GENERATOR(Yuv422Decoder, yuv422decoder);
内容的提问来源于stack exchange,提问作者Ivan Stimac
相关产品推荐
相关产品推荐

