c - x86 和 ARM 上的 float VS int 性能差异如此之大吗?

标签 c floating-point android-ndk arm linderdaum

我想知道智能手机上的 ARM 浮点性能与 x86 相比如何。为此,我编写了以下代码:

#include "Linderdaum.h"
sEnvironment* Env = NULL;

volatile float af = 1.0f;
volatile float bf = 1.0f;
volatile int a = 1;
volatile int b = 1;

APPLICATION_ENTRY_POINT
{
    Env = new sEnvironment();

    Env->DeployDefaultEnvironment( "", "CommonMedia" );

    double Start = Env->GetSeconds();

    float Sum1 = 0.0f;

    for ( int i = 0; i != 200000000; i++ )    {        Sum1 += af + bf;    }

    double End = Env->GetSeconds();

    Env->Logger->Log( L_DEBUG, LStr::ToStr( Sum1, 4 ) );
    Env->Logger->Log( L_DEBUG, "Float: " + LStr::ToStr( End-Start, 5 ) );

    Start = Env->GetSeconds();

    int Sum2 = 0;

    for ( int i = 0; i != 200000000; i++ )    {       Sum2 += a + b;    }

    End = Env->GetSeconds();

    Env->Logger->Log( L_DEBUG, LStr::ToStr( Sum2, 4 ) );
    Env->Logger->Log( L_DEBUG, "Int: " + LStr::ToStr( End-Start, 5 ) );

    Env->RequestExit();

    APPLICATION_EXIT_POINT( Env );
}

APPLICATION_SHUTDOWN
{}

以下是针对不同目标和编译器的结果。

<强>1。 Core i7 920 上的 Windows PC。

VS 2008,调试版本,Win32/x86

(Main):01:30:11.769   Float: 0.72119
(Main):01:30:12.347   Int: 0.57875

floatint 慢。

VS 2008,调试版本,Win64/x86-64

(Main):01:43:39.468   Float: 0.72247
(Main):01:43:40.040   Int: 0.57212

VS 2008,发布版本,Win64/x86-64

(Main):01:39:25.844   Float: 0.21671
(Main):01:39:26.060   Int: 0.21511

VS 2008,发布版本,Win32/x86

(Main):01:33:27.603   Float: 0.70670
(Main):01:33:27.814   Int: 0.21130

int 领先。

<强>2。三星 Galaxy S 智能手机。

GCC 4.3.4,armeabi-v7a,-mfpu=vfp -mfloat-abi=softfp -O3

01-27 01:31:01.171 I/LEngine (15364): (Main):01:31:01.177   Float: 6.47994
01-27 01:31:02.257 I/LEngine (15364): (Main):01:31:02.262   Int: 1.08442

floatint 慢很多。

现在让我们在循环内将加法更改为乘法:

float Sum1 = 2.0f;

for ( int i = 0; i != 200000000; i++ )
{
    Sum1 *= af * bf;
}
...
int Sum2 = 2;

for ( int i = 0; i != 200000000; i++ )
{
    Sum2 *= a * b;
}

VS 2008,调试版本,Win32/x86

(Main):02:00:39.977   Float: 0.87484
(Main):02:00:40.559   Int: 0.58221

VS 2008,调试版本,Win64/x86-64

(Main):01:59:27.175   Float: 0.77970
(Main):01:59:27.739   Int: 0.56328

VS 2008,发布版本,Win32/x86

(Main):02:05:10.413   Float: 0.86724
(Main):02:05:10.631   Int: 0.21741

VS 2008,发布版本,Win64/x86-64

(Main):02:09:58.355   Float: 0.29311
(Main):02:09:58.571   Int: 0.21595

GCC 4.3.4,armeabi-v7a,-mfpu=vfp -mfloat-abi=softfp -O3

01-27 02:02:20.152 I/LEngine (15809): (Main):02:02:20.156   Float: 6.97402
01-27 02:02:22.765 I/LEngine (15809): (Main):02:02:22.769   Int: 2.61264

问题是:我缺少什么(任何编译器选项)?浮点运算在 ARM 设备上真的很慢(与 int 相比)吗?

最佳答案

-mfloat-abi=softfp 显式调用模拟 float 。检查您的 Galaxy 规范,如果可能,使用硬件 FP 进行编译。

并不是所有的 ARM CPU 都支持硬件浮点。 NDK 的 ARMEABI 的默认设置要求模拟 FP - 它应该与无 FP 的机器兼容。充其量,您可以对 CPU 功能进行一些运行时分支。

关于c - x86 和 ARM 上的 float VS int 性能差异如此之大吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12352523/

相关文章:

c++ - sizeof 运算符出错

Java 浮点整数运算

c - 双 float ?使用 double 时计算错误

android mmap 因内存不足而失败

c - 如果我不包含标题,为什么在调用函数之前清除 EAX?

c - 寻找简单算法的大 O

security - 在 Jelly Bean 上运行 native ARM 可执行文件

java.lang.IllegalArgumentException : Unable to load native library:/data/app-lib/com. gibucsoft.blocklife-1/libblocklife.so

c - 指针有问题

java - Java 中的 Float 类型转换