如何在 gcc 上启用__fp16类型以进行x86_64
How to enable __fp16 type on gcc for x86_64
__fp16
浮点数据类型是众所周知的C标准的扩展,特别是在ARM处理器上使用。我想在我的x86_64处理器上运行它们的IEEE版本。虽然我知道他们通常没有这个,但我可以用"无符号短"存储(它们具有相同的对齐要求和存储空间)和(硬件)浮点运算来模拟它们。
有没有办法在 gcc 中请求它?
我认为四舍五入可能有点"不正确",但这对我来说没关系。
如果这也适用于C++,那将是理想的。
我没有在 gcc 中找到这样做的方法(从 gcc 8.2.0 开始)。
至于 clang,在 6.0.0 中,以下选项取得了一些成功:
clang -cc1 -fnative-half-type -fallow-half-arguments-and-returns
该选项-fnative-half-type
启用__fp16
类型(而不是将它们提升为浮动)。虽然选项-fallow-half-arguments-and-returns
允许按值传递__fp16
,但非标准的 API 请注意不要混合不同的编译器。
话虽如此,它不提供使用__fp16
类型的数学函数(它会将它们提升到/从float
或double
)。
对于我的用例来说,这已经足够了。
C++23 引入了std::float16_t
#include <stdfloat> // C++23
int main()
{
std::float16_t f = 0.1F16;
}
_Float16是你现在应该在最新版本的clang和gcc中寻找的类型。
至少在我使用的编译器中__fp16是一个有限的类型,你只能与binary32(使用支持的硬件)进行转换,而_Float16更像是一个"真正的"算术类型,而不是你应该在如此有限的精度下尝试太多。
相关文章:
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 致命错误LNK1112:在 npm 安装期间,模块计算机类型'X86'与目标计算机类型'x64'冲突
- 致命错误LNK1112:通过 vcvarsall .bat x86 运行构建'X86'模块计算机类型'x64'与目标计算机类型冲突
- QtGui4.lib(QtGui4.dll):致命错误LNK1112:模块计算机类型"X86"与目标计算机类型"x64"冲突
- C:x86 英特尔内在函数对 _mm_log2_ps() -> 错误的用法:不兼容的类型"int"?
- LNK1112:模块计算机类型"x64"与目标计算机类型"X86"冲突:Qt创建者
- 无法访问 x86 上 SSE 类型的内存,但在 x64 上工作正常
- 对于多少种类型的 x86 处理器,Ngen 和 .net 本机一次创建本机代码
- 是否有跨平台(x86和x64)PInvoke和windows数据类型的明确指南
- 将c++项目类型从x86更改为x64后的链接器错误
- msvcprtd.lib(MSVCP100D.dll):致命错误LNK1112:模块计算机类型"X86"与目标计算机类型"x64"冲突
- 致命错误LNK1112:2010 年模块计算机类型"X86"与目标计算机类型"X64"冲突
- 错误 LNK1112:模块计算机类型"x64"与目标计算机类型"X86"冲突