1

我正在使用 NEON SIMD 指令编写 Android 应用程序的一部分,针对 Cortex A8 处理器。根据此参考手册,NEON 支持 16 位和 32 位浮点数,即float16_tfloat32_t。当我尝试使用float16_t及其所有关联的向量类型时,我收到一条错误消息,指出此类型未声明。在查看 的内容时arm_neon.h,我发现这个类型确实是未声明的。

是否有一个原因?ARM 的高级 SIMD 显然支持这样的数据类型和指令。有没有人遇到/解决这个问题?它在任何地方都有记录吗?

4

3 回答 3

6

Cortex-A8 处理器不支持硬件中的 16 位浮点数。

Cortex-A9处理器确实具有在 16 位和 32 位浮点之间转换的指令,但这就是您所得到的(这就是 IEEE-754 系统应该提供的全部内容——float16 不适用于算术,仅用于紧凑的存储)。使用模型是加载float16数据,将其转换为float32进行运算,然后在存储前转换回float16。

于 2011-07-25T21:29:58.527 回答
1

嗯,对 SIMD 指令不太熟悉。您发布的文档没有提到float16_t,而是使用了车道数(例如float16x4_t)

另外,您是否尝试过 "Float16_t" 而不是 "float16_t" ?

这是我的家用笔记本电脑,所以我无法访问 ARM 编译器,但我明天会在办公室重新检查一下

于 2011-07-05T21:45:18.103 回答
1

您能否在链接的文档中指定一个示例部分,其中调用了这些 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.
于 2011-07-05T22:10:03.917 回答