arm_neon.h 是不是缺少所有 float16_t 类型?
Posted
技术标签:
【中文标题】arm_neon.h 是不是缺少所有 float16_t 类型?【英文标题】:Is arm_neon.h missing all float16_t types?arm_neon.h 是否缺少所有 float16_t 类型? 【发布时间】:2011-07-05 21:06:05 【问题描述】:我正在使用 NEON SIMD 指令编写 android 应用程序的一部分,目标是 Cortex A8 处理器。根据this reference manual,NEON 支持 16 位和 32 位浮点数,即float16_t
和float32_t
。当我尝试使用 float16_t
及其所有关联的向量类型时,我收到一个错误,提示此类型未声明。在查看arm_neon.h
的内容时,发现这个类型确实是未声明的。
这是有原因的吗? ARM 的高级 SIMD 显然支持这样的数据类型和指令。有没有人遇到/解决这个问题?它是否记录在任何地方?
【问题讨论】:
【参考方案1】:Cortex-A8 处理器不支持硬件中的 16 位浮点数。
Cortex-A9 处理器确实具有在 16 位和 32 位浮点之间转换的指令,但这就是您所获得的全部内容(这就是应该提供的全部内容)在 IEEE-754 系统上——float16 不适用于算术,仅用于紧凑存储)。使用模型是加载float16数据,转换成float32做你的算术,然后再转换回float16再存储。
【讨论】:
【参考方案2】:您能否在链接的文档中指定一个示例部分,其中调用了这些 16 位浮点操作?我看到定义了很多 16 位整数运算。你用的是ARM的编译器还是gcc?你说的是 SIMD 还是 NEON?
“与 ARMv6 架构中的 32 位宽 SIMD 相比,NEON™ 技术建立在 SIMD 的概念之上,具有一个专用模块,可提供 128 位宽的矢量运算。”
编辑:
我试过了,没有编译器抱怨:
int myfun ( int a)
__fp16 b;
b=a+1;
return(b+1);
使用这个命令行:
arm-none-linux-gnueabi-gcc -S -mcpu=mpcore -mfp16-format=ieee -mfpu=neon-fp16 simd.c
使用 codesourcery lite 2011.03
arm-none-linux-gnueabi-gcc --version
arm-none-linux-gnueabi-gcc (Sourcery G++ Lite 2011.03-41) 4.5.2
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
【讨论】:
我将 NEON 与 GCC 一起使用,但它只是现有 SIMD 的扩展,就像您在上面提到的那样。 您引用的 ARM 工具链手册适用于 ARM 工具链,而不是 gcc。苹果和橙子。需要找到 gcc 文档,说明它支持什么和不支持什么.. 是的,就在这里gcc.gnu.org/onlinedocs/gcc/… 我假设您正在使用这些命令行选项的组合? 似乎 GCC 根本不接受那些像选项一样识别这些命令的人。我要更新我的问题。【参考方案3】:嗯,对 SIMD 指令不太熟悉。您发布的文档没有提到float16_t,而是使用了车道数(例如float16x4_t)
另外,您是否尝试过 "Float16_t" 而不是 "float16_t" ?
这是我的家用笔记本电脑,所以我无法访问 ARM 编译器,但我明天会在办公室重新检查一下
【讨论】:
啊,我现在看到很多float16了。 使用 __fp16 的 NEON 内部函数原型仅适用于具有 NEON 半精度 VFP 扩展的目标。要启用 __fp16,请使用 --fp16_format 命令行选项。请参阅第 3-57 页的 --fp16_format=format。您是否使用了 --fp16_format 命令行选项,是否有支持半精度浮点格式的 NEON? 嗯,这是一个page of GNU compiler's documentation,它记录了使用这些标志。但是,GCC 似乎不接受它们。我正在调查这个问题,但我怀疑出于某种原因,Android NDK(我正在使用)带有旧版本的 GCC。 对不起,对不起,将 cmets 添加到错误的答案中,正在尝试添加到我的答案中。以上是关于arm_neon.h 是不是缺少所有 float16_t 类型?的主要内容,如果未能解决你的问题,请参考以下文章