Как вставить некоторые вычисления в петлю среднего уровня? - PullRequest
1 голос
/ 26 октября 2019

Я новый парень, работающий с 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

Кто-нибудь может мне помочь?

Большое спасибо!

...