Я новый парень, работающий с Halide. Я столкнулся с проблемой при переносе некоторого галидного кода на Android через Halide :: Generator. Ниже приведен мой код:
#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. используйте Buffer: ref_val и alt_val 16x16, чтобы принять итерационный результат для ix и iy, затем выполнить некоторые вычисления, заполнить результат в ref_val 4. передать ref_val обратно в ту же позицию (ix2, iy2, tx_m, ty_m) функции.
Когда я скомпилировал и запустил ее, я получил ошибку ниже: В чистом определении функции "F1": домен редукции, на который есть ссылка в чистом определении функции. Прервано (ядро сброшено)
Я также попробовал ниже: F1 (ix2, iy2, tx_m, ty_m) = ref_val (ix2, iy2);Компиляция и запуск в порядке, и статическая библиотека генерируется успешно, но когда я запускаю ее в Android, она вылетает из-за проблемы переполнения ниже: I halide: Error: Доступ к входному буферу ref_val_bf осуществляется при 31, что превышает максимум (15) в измерении 0
Кто-нибудь может мне помочь?
Большое спасибо!