0

我在 VS2013 中使用卤化物。我已经成功构建并运行了第一个教程。

我正在尝试实现我的一些代码,但不明白为什么它不会编译。代码如下:

int main(int argc, char **argv) {

ImageParam input(UInt(8), 3);

Func input_clamped = BoundaryConditions::repeat_edge(input);
Var x, y, c;

Func float_input_clamped;
float_input_clamped(x, y, c) = cast<float>(input_clamped(x, y, c)) / 255.0f;

Func input_lum;
input_lum(x, y) = cast<float>(0.299f * float_input_clamped(x, y, 0) + 0.587f * float_input_clamped(x, y, 1) + 0.114f * float_input_clamped(x, y, 2));

Func m45;
m45(x, y) = fabsf(input_lum(x - 1, y) - input_lum(x, y + 1)) + fabsf(input_lum(x, y + 1) - input_lum(x + 1, y + 2));

return 0;
}

错误发生在 m45(x, y) = ... 行中。显然, input_lum 不被视为浮点值。错误消息是“不存在从 Halide::Expr 到 float 的合适转换。”

显然所有的演员表和浮动数学都被忽略了。

(我知道我还没有初始化输入——我试图理解我在编写 Halide 代码时的思考方式,而类型推断让我很适应。)

我在这里做错了什么?

(如果不清楚,我只想获取 RGB 图像的亮度,并对亮度进行一些数学运算。如果可行,我会很高兴留在整数空间中。)

好的,我试验并尝试了这个:

ImageParam input(UInt(8), 3);

Func input_clamped = BoundaryConditions::repeat_edge(input);
Var x, y, c;

Func input_lum;
input_lum(x, y) = 0.299f * input_clamped(x, y, 0) + 0.587f * input_clamped(x, y, 1) + 0.114f * input_clamped(x, y, 2);

Func m45;
m45(x, y) = abs(input_lum(x - 1, y) - input_lum(x, y + 1)) + abs(input_lum(x, y + 1) - input_lum(x + 1, y + 2));

现在编译了,但我不知道它在做什么。为什么 input_lum() 的类型不是浮点数?

4

1 回答 1

3

这里的混淆不是在您的 Halide 代码中混合int和表达式,而是将s 与 C++和函数混合。是一个 C 函数,它接受并返回 C 浮点值。你真正想要的是一个 Halide 内在函数,它采用浮点类型的 Halide 表达式的绝对值。在这种情况下,我相信这是,正如您在第二个片段中发现的那样。floatHalide::ExprintfloatfabsfHalide::abs

Halide 程序的编译/构造时间(即此 C++ 代码的运行时间)与 Halide 程序的运行时间(当您调用realize或调用由 生成的函数时)之间的区别compile_to_file是一个非常常见的早期绊脚石. 如果目前你删除任何using namespace Halide它应该更清楚你在哪里明确使用卤化物函数,比如Halide::abs——实际的标准 C 函数,比如对 s (你在编写卤化物算法代码时使用的类型)::fabsf一无所知Halide::Expr,所以你永远无法像在 Halide 程序中那样有意义地使用它们。math.h碰巧的是,为了方便起见,Halide 中的许多标准数学函数与它们的对应函数具有相同的名称。没有using namespace Halide,但是,您将被迫明确使用 Halide 函数(在这种情况下有意义),而不是 themath.h或其他函数(没有)。

于 2015-08-22T08:29:01.510 回答