首页 > 解决方案 > 如何在中级循环中插入一些计算?

问题描述

我是一个从事卤化物编程的新手。我在通过 Halide::Generator 将一些卤化物代码移植到 android 时遇到了一个问题。下面是我的代码:

#include "Halide.h"
#include <string>
#include <stdio.h>

using namespace Halide;
using namespace Halide::ConciseCasts;
using namespace std;


class TestGenerator : public Halide::Generator<TestGenerator> 
{ 
public:
    Input<Buffer<uint16_t>> imgs{"imgs", 3};

    void generate() 
    {   
        Func imgs_mirror = BoundaryConditions::mirror_interior(imgs, 0, imgs.width(), 0, imgs.height());
        Func F1("F1");

        RDom r0(0, 16, 0, 16);       
        Var ix, iy, tx_m, ty_m, n_m; 
        Buffer<uint16_t> ref_val(16, 16), alt_val(16, 16);
        ref_val(r0.x, r0.y) = imgs_mirror(tx_m*16+r0.x, ty_m*16+r0.y, 0);
        alt_val(r0.x, r0.y) = imgs_mirror(al_x, al_y, 1);

        ... //process

        Var ix2, iy2;
        RDom r2(0, 16, 0, 16); 

        F1(ix2, iy2, tx_m, ty_m) = ref_val(r2.x, r2.y);

        F1.compute_root();
    }
};

HALIDE_REGISTER_GENERATOR(TestGenerator, test_generator)

预期的过程是: 1. tx_m 和 ty_m 处理顶层(外)循环 2. ix 和 iy 处理底层(内)循环(固定为 16x16 的块) 3. 使用 16x16 的 Buffer:ref_val 和 alt_val接受 ix 和 iy 的迭代结果,然后进行一些计算,将结果填充到 ref_val 4. 将 ref_val 反馈回 Func 的相同位置(ix2,iy2,tx_m,ty_m)。

当我编译并运行它时,我得到以下错误:在 Func“F1”的纯定义中:纯函数定义中引用的缩减域。中止(核心转储)

我也在下面尝试过: F1(ix2, iy2, tx_m, ty_m) = ref_val(ix2, iy2); 编译运行正常,静态库生成成功,但是当我在android中运行它时,它会崩溃并出现以下溢出问题: I halide : Error: Input buffer ref_val_bf is access at 31, which is beyond the max ( 15) 在维度 0

谁能帮我一把?

非常感谢!

标签: halide

解决方案


推荐阅读