我想知道智能手机上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. Windows PC on Core i7 920.
VS 2008,调试构建,Win32 32/x86
(Main):01:30:11.769 Float: 0.72119
(Main):01:30:12.347 Int: 0.57875float比int慢。
VS 2008,调试构建,Win64 64/x86-64
(Main):01:43:39.468 Float: 0.72247
(Main):01:43:40.040 Int: 0.57212VS 2008,版本构建,Win64 64/x86-64
(Main):01:39:25.844 Float: 0.21671
(Main):01:39:26.060 Int: 0.21511VS 2008,版本构建,Win32 32/x86
(Main):01:33:27.603 Float: 0.70670
(Main):01:33:27.814 Int: 0.21130int正在取得领先地位。
2.三星Galaxy智能手机.
GCC 4.3.4,armeabi-v7a,-mfpu=vfp -mfloat=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.08442float比int慢得多。
现在让我们改变循环中乘法的加法:
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
(Main):02:00:39.977 Float: 0.87484
(Main):02:00:40.559 Int: 0.58221VS 2008,调试构建,Win64 64/x86-64
(Main):01:59:27.175 Float: 0.77970
(Main):01:59:27.739 Int: 0.56328VS 2008,版本构建,Win32 32/x86
(Main):02:05:10.413 Float: 0.86724
(Main):02:05:10.631 Int: 0.21741VS 2008,版本构建,Win64 64/x86-64
(Main):02:09:58.355 Float: 0.29311
(Main):02:09:58.571 Int: 0.21595GCC 4.3.4,armeabi-v7a,-mfpu=vfp -mfloat=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慢吗?
发布于 2012-09-10 15:25:45
参见http://github.com/dwelch67/stm32f4d,请参阅float03目录
测试比较了这两个函数固定的和浮动的。
.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是浮点,浮动测试函数中有一些额外的指令可能解释了差异:
00004E2C
00004E2C
00004E2E
00004E2E
00004E2C
00004E2E stm32f4中的fpu仅限于在其兄弟姐妹中发现的vfp的单精度版本。您应该能够在任何使用vfp硬件的armv7上执行上述测试。
通过将__aeabi_fadd函数链接进来,并且每次通过循环进行额外的调用,加上额外的内存访问时间(可能是外部或内部的转换,库函数等等),可以增加您正在看到的内容。当然,答案是拆卸。
发布于 2012-09-10 13:30:12
-mfloat-abi=softfp显式地调用模拟浮点数。检查您的银河规格,并在可能的情况下用硬件FP编译。
并非所有ARM CPU的支持硬件浮点开始。NDK的ARMEABI默认设置要求模拟的FP --它应该与无FP的机器兼容。充其量,您可以在CPU功能上进行一些运行时分支。
发布于 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版本的编译器可用。考虑到架构的不同,我认为您的结果是可信的。
https://stackoverflow.com/questions/12352523
复制相似问题