halide - 如何在中级循环中插入一些计算?
问题描述
我是一个从事卤化物编程的新手。我在通过 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
谁能帮我一把?
非常感谢!
解决方案
推荐阅读
- node.js - 在将 appium 作为 DeprecationWarning 运行之前,我有一个警告。它是什么?
- angular - 我正在尝试实现 refreshCountryList ,它应该返回包含所有国家的 countryList(array of objects) 变量
- reactjs - 处理反应查询突变和反应上下文时的最佳策略
- mediasoup - mediasoup-client TypeError:无法在 createRecvTransport 处读取 null 的属性“_createTransport”
- oop - 设计过程中的SOLID原则思考
- dart - 如何在 3D 视图中显示图像?
- c# - easyCaching nuget 刷新缓存 redis c#
- python-2.7 - 如何在 python2.7 的 oneDrive 中推送/添加空白工作簿(工作表)
- python - 卡住试图找出我的嵌套循环的问题
- git - 初始合并后无法将新提交合并到另一个仓库