在Halide中混合int和float

时间:2015-08-22 07:19:18

标签: halide

我使用Halide和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不被认为是浮点值。错误消息是&#34;没有从Halide :: Expr到float的合适转换。&#34;

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

(我知道我还没有初始化输入 - 我试图理解编写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()的类型不会浮动?

1 个答案:

答案 0 :(得分:3)

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

您的Halide程序的编译/构建时间(此C ++代码的运行时)与Halide程序的运行时(当您调用realize或调用compile_to_file)生成的函数,是一个非常常见的早期绊脚石。如果您暂时删除任何using namespace Halide,那么在您明确使用像Halide::abs这样的Halide函数的地方应该会更清楚 - 像::fabsf这样的实际标准C函数对{{Halide::Expr一无所知。 1}} s(在编写Halide算法代码时使用的类型),因此您无法以在Halide程序中尝试的方式有意义地使用它们。只是为了方便起见,Halide中的许多标准数学函数与math.h对应的名称相同;但是,如果不使用using namespace Halide,您将被迫明确使用Halide函数(在此上下文中有意义),而不是math.h或其他函数(不使用)。