首页 > 解决方案 > 卤化物数学是否以“浮点”(32 位)执行?

问题描述

我正在编写 Halide 代码,并且我已将 Buffer<double> 输入声明为我的 Halide 函数的输入。但是,我不确定这是否有意义,因为 Halide tutorial#1 说

// Halide does type inference for you. Var objects represent
// 32-bit integers, so the Expr object 'x + y' also represents a
// 32-bit integer, and so 'gradient' defines a 32-bit image, and
// so we got a 32-bit signed integer image out when we call
// 'realize'. Halide types and type-casting rules are equivalent
// to C.

我可以毫无问题地运行该函数,但我不确定是否在我不知道的情况下进行了一些类型转换以将我的 double 转换为 float。

标签: halide

解决方案


好问题!(我们需要更多更好的文档。)

使用 s 是完全合理double的。很像在 C 中(在您引用的评论中提到的那些 C 风格的类型提升规则),double <op> float或者double <op> int将执行计算并将结果返回为double.

例如,如果你有你的Buffer<double> input,那么:

Func f; Var x, y;
f(x,y) = input(x,y)*2;

推断类型类型为fas double,以及。如果您检查作为结果输出的缓冲区的类型,您会注意到这一点。与在 C 中一样,int常数2double在乘法之前提升,结果将存储为double. each 的类型只是由首先定义它Func的右手边的推断类型给出。Expr

类型会自动升级,从不降级。如果要限制结果的类型,可以cast在表达式中使用显式 s。

那有意义吗?


推荐阅读