首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在x86和ARM上,float的性能有那么大的不同吗?

在x86和ARM上,float的性能有那么大的不同吗?
EN

Stack Overflow用户
提问于 2012-09-10 13:15:40
回答 4查看 6.7K关注 0票数 9

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

代码语言:javascript
复制
#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. Windows PC on Core i7 920.

VS 2008,调试构建,Win32 32/x86

代码语言:javascript
复制
(Main):01:30:11.769   Float: 0.72119
(Main):01:30:12.347   Int: 0.57875

floatint慢。

VS 2008,调试构建,Win64 64/x86-64

代码语言:javascript
复制
(Main):01:43:39.468   Float: 0.72247
(Main):01:43:40.040   Int: 0.57212

VS 2008,版本构建,Win64 64/x86-64

代码语言:javascript
复制
(Main):01:39:25.844   Float: 0.21671
(Main):01:39:26.060   Int: 0.21511

VS 2008,版本构建,Win32 32/x86

代码语言:javascript
复制
(Main):01:33:27.603   Float: 0.70670
(Main):01:33:27.814   Int: 0.21130

int正在取得领先地位。

2.三星Galaxy智能手机.

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

代码语言:javascript
复制
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慢得多。

现在让我们改变循环中乘法的加法:

代码语言:javascript
复制
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 32/x86

代码语言:javascript
复制
(Main):02:00:39.977   Float: 0.87484
(Main):02:00:40.559   Int: 0.58221

VS 2008,调试构建,Win64 64/x86-64

代码语言:javascript
复制
(Main):01:59:27.175   Float: 0.77970
(Main):01:59:27.739   Int: 0.56328

VS 2008,版本构建,Win32 32/x86

代码语言:javascript
复制
(Main):02:05:10.413   Float: 0.86724
(Main):02:05:10.631   Int: 0.21741

VS 2008,版本构建,Win64 64/x86-64

代码语言:javascript
复制
(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=softfp -O3

代码语言:javascript
复制
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慢吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-09-10 15:25:45

参见http://github.com/dwelch67/stm32f4d,请参阅float03目录

测试比较了这两个函数固定的和浮动的。

代码语言:javascript
复制
.thumb_func
.globl add
add:
    mov r3,#0
loop:
    add r3,r0,r1
    sub r2,#1
    bne loop
    mov r0,r3
    bx lr

.thumb_func
.globl m4add
m4add:
    vmov s0,r0
    vmov s1,r1
m4loop:
    vadd.f32 s2,s0,s1
    sub r2,#1
    bne m4loop
    vmov r0,s2
    bx lr

结果并不令人惊讶,0x4E2C时间是不动点,0x4E2E是浮点,浮动测试函数中有一些额外的指令可能解释了差异:

代码语言:javascript
复制
00004E2C                                                                        
00004E2C                                                                        
00004E2E                                                                        
00004E2E                                                                        
00004E2C                                                                        
00004E2E    

stm32f4中的fpu仅限于在其兄弟姐妹中发现的vfp的单精度版本。您应该能够在任何使用vfp硬件的armv7上执行上述测试。

通过将__aeabi_fadd函数链接进来,并且每次通过循环进行额外的调用,加上额外的内存访问时间(可能是外部或内部的转换,库函数等等),可以增加您正在看到的内容。当然,答案是拆卸。

票数 3
EN

Stack Overflow用户

发布于 2012-09-10 13:30:12

-mfloat-abi=softfp显式地调用模拟浮点数。检查您的银河规格,并在可能的情况下用硬件FP编译。

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

票数 5
EN

Stack Overflow用户

发布于 2012-09-10 13:52:44

@Seva -mfloat-abi标志仅控制浮点值如何传递给函数。使用softfp值是使用普通寄存器传递的。使用hardfp值是通过FPU寄存器传递的。-mfloat-abi标志不能控制所使用的硬件指令。

基本上,softfp是用来与没有FPU的设备保持向后兼容性的。使用softfp会给使用FPU的设备带来额外的开销。

@Sergey比较x86和ARM就像比较苹果和橘子一样。它们是两个截然不同的平台。ARM的主要设计目标是低功耗、无速度。使用hardfp可以看到一些性能改进。还有一个4.6版本的编译器可用。考虑到架构的不同,我认为您的结果是可信的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12352523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档