从数组初始化 Func
Initialize Func from an array
是否可以从生成器中的数组初始化 Func class?代码应如下所示。
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 直接替换为相应的数字。
以下编译并说明了执行此操作的一种方法:
#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);
}
};
权重将在编译时嵌入到生成的代码中。我们也应该有办法为初始化列表中的权重提供常量值,但我目前没有找到它。
是否可以从生成器中的数组初始化 Func class?代码应如下所示。
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 直接替换为相应的数字。
以下编译并说明了执行此操作的一种方法:
#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);
}
};
权重将在编译时嵌入到生成的代码中。我们也应该有办法为初始化列表中的权重提供常量值,但我目前没有找到它。