快速 int 到 float 转换

Fast int to float conversion

提问人:tommsch 提问时间:2/7/2021 更新时间:2/7/2021 访问量:1576

问:

我正在使用 s 在 Cuda 中进行计算。由于 GPU 上没有足够的内存,因此我们将原始数据存储在 GPU 上。因此,在使用此数据之前,我必须将其转换为 s。 s 的数量不是那么大(大约 12k 和 相同的数量)。分析表明,转换数字需要相当长的时间(约5-10%)。其余的计算不能再优化了。 因此,我的 3+1 问题是:floatuint16_tint16_tfloatintuint16_tint16_t

  • 将 s 转换为 s 的最快方法是什么?intfloat
  • 转换时是否有实质性差异或 .int16_tuint16_t
  • 转换较大的类型时是否有实质性差异,例如 或。intint32int64
  • 为什么 SO 上的所有问题都是关于将浮点数s 转换为 ints 的。这是人们通常不会做的事情吗?
C++ 浮点 CUDA 类型转换 整数

评论

0赞 Lukas-T 2/7/2021
你说的“皈依”到底是什么意思??int16_t x =...; float f = float(x);
0赞 tommsch 2/7/2021
@churill 是的,没错。
1赞 Yakk - Adam Nevraumont 2/7/2021
这种转换是在 CUDA 中还是在 CUDA/nonCUDA 边缘发生?(我假设第一个)。您现有的转化情况如何?剩下的计算是什么样的,至少在伪代码中是这样?你是否使用了你生产的所有花车?这些值的可分离性如何?16 位 int 到 32 位浮点数应该是位移位;签名稍微复杂一点。
0赞 prog-fh 2/7/2021
这个答案与您的问题有关,一个 16 位整数将在很大程度上适合小数部分,但恐怕确定所需移位的循环会更慢......while
2赞 talonmies 2/7/2021
GPU 编译器将发出用于简单转换的硬件指令。文档指出,吞吐量为每个多处理器每个时钟周期 16 或 32 条指令。在此基础上,我猜你的微基准测试是错误的,你归因于转化成本的是另一回事

答:

6赞 πάντα ῥεῖ 2/7/2021 #1
  • 将整数转换为浮点数的最快方法是什么。

简单的分配。有一些硬件类型转换指令,CUDA 编译器会自动发出这些指令,而无需您执行任何操作。硬件转换包括正确的IEEE舍入模式。

  • 转换时是否有实质性差异或 .int16_tuint16_t

不。

  • 转换较大的 int 类型时是否有实质性差异,例如 或。int32int64

不。是的。记录了类型转换指令的指令吞吐量。32 位和 16 位整数到浮点转换指令具有相同的吞吐量。在大多数架构上,64 位转换指令比 16 位和 32 位转换指令慢得多。

  • 为什么 SO 上的所有问题都是关于将浮点数转换为整数的。这是人们通常不会做的事情吗?

因为许多人在将 or 类型转换为类型时不明白 和 类型之间的区别,以及为什么它们会失去精度。
在你的情况下,这没有什么需要担心的。
floatintfloatdoubleint