从数组初始化Func

时间:2017-06-10 15:19:48

标签: halide

是否可以从生成器类中的数组初始化Func?代码应如下所示。

class SobelConv: public Halide::Generator<SobelConv> {

const signed char kernelx[3][3] = {
    {-1, 0, 1},
    {-2, 0, 2},
    {-1, 0, 1}
};

void generate() {
     for (int y = 0; y < 3; y++)
        for (int x = 0; x < 3; x++)
            kernel_x(x, y) = kernelx[y][x];

     conv_x(x, y) += gray(x+win.x, y+win.y) * kernel_x(win.x + 1, win.y + 1);
}

Func kernel_x{"kernel_x"};

目前,我的方法是定义Input<Buffer<int8_t>> kernel_x。我不希望它成为管道函数的参数,并希望kernel_x直接替换为相应的数字。

1 个答案:

答案 0 :(得分:1)

以下编译并说明了一种方法:

#include "Halide.h"

class SobelConv: public Halide::Generator<SobelConv> {
  signed char weights[3][3] = {
    {-1, 0, 1},
    {-2, 0, 2},
    {-1, 0, 1}
  };

  Input<Buffer<int8_t>> gray{"gray", 2};
  Halide::Buffer<int8_t> kernel_x{&weights[0][0], 3, 3};

  Output<Buffer<int8_t>> conv_x{"conv_x", 2};

  Var x, y;
  RDom win{0, 3};

  void generate() {
    conv_x(x, y) += gray(x+win.x, y+win.y) * kernel_x(win.x + 1, win.y + 1);
  }
};

权重将在编译时嵌入到生成的代码中。我们应该有一种方法在初始化列表中为权重提供常量值,但我现在还没有找到它。