【发布时间】:2012-09-03 08:51:15
【问题描述】:
我想知道智能手机上的 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
float 比 int 慢。
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
float 比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/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 相比)?
【问题讨论】:
-
改变测试顺序:先int,后float。然后检查它是否相同
-
@tuğrul büyükışık:我需要任何额外的编译器开关吗?
-
删除 a/b af/bf 变量上的 volatile 并将它们传入,您在这里测量的内存性能比浮点性能更多(当然,您不能在此处将 a/b 定义为常量,优化器将删除他们并发布答案)。
-
从硬件的角度来看,无论是加法还是乘法,浮点比定点涉及更多。两者都使用定点 alu(加法器、乘法器等),但浮点数必须预先准备值并在后端标准化值。理想情况下,这是一个时钟周期,但并非总是如此。 arm fpu(嗯,不止一个)在后端同步,你可以去做其他事情然后回来询问答案,如果没有完成,它就会停止直到答案完成。我不知道 x86 fpus 是如何工作的。由于您添加的数字很小,因此应该非常快。
-
同意@dwelch,从a/b、af/bf中移除volatile。如果你只是在循环之后使用变量,这足以让优化器删除计算。
标签: c floating-point android-ndk arm linderdaum