【发布时间】:2017-12-19 21:20:11
【问题描述】:
__fp16 浮点数据类型是众所周知的 C 标准扩展,尤其是在 ARM 处理器上使用。我想在我的 x86_64 处理器上运行它们的 IEEE 版本。虽然我知道他们通常没有这些,但我可以使用“无符号短”存储(它们具有相同的对齐要求和存储空间)和(硬件)浮点运算来模拟它们。
有没有办法在 gcc 中请求?
我认为舍入可能有点“不正确”,但这对我来说没问题。
如果这也适用于 C++,那将是理想的。
【问题讨论】:
-
我认为 x86 目标没有此功能。如果是这样,它会非常慢,因为它都必须在软件仿真中运行,而不是使用 FP 硬件。你为什么要这样做?
-
@CodyGray:半精度浮点数原生支持最近的(Intel 自 Ivy Bridge,AMD 自 Piledriver)x86 CPU(仅作为存储格式,需要转换为单精度才能进行实际计算)。
-
啊,是的,他们是,@Fanael。感谢您指出了这一点。我错过了他们的介绍。因此,您将使用
_mm256_cvtph_ps作为“加载”(将半浮点转换为浮点),将_mm256_cvtps_ph作为“存储”(将浮点转换为半浮点)。事实证明,这相当快,并且在内存受限的情况下实际上很有用。 Nonyme,在平台抽象库之类的东西中使用内在函数来实现这一点是否可以接受?还是您对让编译器隐式生成此代码一无所知? -
目标是在 x86_64 服务器场上运行为 ARM 设计的庞大代码库。如果“平台抽象库”不需要对代码进行任何修改,那就可以了。但我怀疑这是可行的。注意:我设法通过欺骗语义解析器来定义 __fp16 并将其作为 x86_64 上的函数参数/返回值来欺骗 Clang。然后它设法使用上述内在函数进行转换并使用浮点数进行计算。
-
我编辑了 clang 源代码以在 X86 目标上添加 __fp16 内置类型(默认情况下它仅在 ARM 上启用)。然后编译器的其余部分自行处理。
标签: c++ c gcc x86 half-precision-float