使用Android NDK r6构建项目的发布版本

时间:2011-09-21 15:39:37

标签: optimization floating-point android-ndk

我正在使用cygwin和Windows Vista编译Android NDK r6b的helloworld示例。我注意到我的Android手机上的代码需要14到20毫秒(它有一个800mhz的CPU Qualcomm MSM7227T芯片组,支持硬件浮点):

float   *v1, *v2, *v3, tot;

int     num = 50000;
v1 = new float[num];
v2 = new float[num];
v3 = new float[num];

// Initialize vectors. RandomEqualREAL() returns a floating point number in a specified range.

for ( int i = 0; i < num; i++ )
{
    v1[i] = RandomEqualREAL( -10.0f, 10.0f );
    if (v1[i] == 0.0f) v1[i] = 1.0f;
    v2[i] = RandomEqualREAL( -10.0f, 10.0f );
    if (v2[i] == 0.0f) v2[i] = 1.0f;
}
clock_t start = clock() / (CLOCKS_PER_SEC / 1000);
tot = 0.0f;
for ( int k = 0; k < 1000; k++)
{
    for ( int i = 0; i < num; i++ )
    {
        v3[i] = v1[i] / (v2[i]);
        tot += v3[i];
    }
}
clock_t end = clock() / (CLOCKS_PER_SEC / 1000);
printf("time %f\n", tot, (end-start)/1000.0f);

在我的2.4ghz笔记本电脑上需要.45毫秒(当系统运行其他程序时,如Chrome,2/3 ides,.pdf打开等等时间计时...)。我想知道helloworld应用程序是否作为发布版本构建。我注意到g ++被调用了

-msoft浮子。

这是否意味着它正在使用浮点仿真? 我需要使用哪些命令行选项来构建程序的优化版本?如何指定这些选项?

这就是g ++被调用的方式。:

/cygdrive/d/android/android-ndk-r6b/toolchains/arm-linux-androideabi-4.4.3/prebu
ilt/windows/bin/arm-linux-androideabi-g++ -MMD -MP -MF D:/android/workspace/hell
oworld/obj/local/armeabi/objs/ndkfoo/ndkfoo.o.d.org -fpic -ffunction-sections -f
unwind-tables -fstack-protector -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_
5E__ -D__ARM_ARCH_5TE__  -Wno-psabi -march=armv5te -mtune=xscale -msoft-float -f
no-exceptions -fno-rtti -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -f
inline-limit=64 -ID:/android/workspace/helloworld/jni/boost -ID:/android/workspa
ce/helloworld/jni/../../mylib/jni -ID:/android/android-ndk-r6b/sources/cxx-stl/g
nu-libstdc++/include -ID:/android/android-ndk-r6b/sources/cxx-stl/gnu-libstdc++/
libs/armeabi/include -ID:/android/workspace/helloworld/jni -DANDROID  -Wa,--noex
ecstack -fexceptions -frtti  -O2 -DNDEBUG -g   -ID:/android/android-ndk-r6b/plat
forms/android-9/arch-arm/usr/include -c  D:/android/workspace/helloworld/jni/ndk
foo.cpp -o D:/android/workspace/helloworld/obj/local/armeabi/objs/ndkfoo/ndkfoo.
o && ( if [ -f "D:/android/workspace/helloworld/obj/local/armeabi/objs/ndkfoo/nd
kfoo.o.d.org" ]; then awk -f /cygdrive/d/android/android-ndk-r6b/build/awk/conve
rt-deps-to-cygwin.awk D:/android/workspace/helloworld/obj/local/armeabi/objs/ndk
foo/ndkfoo.o.d.org > D:/android/workspace/helloworld/obj/local/armeabi/objs/ndkf
oo/ndkfoo.o.d && rm -f D:/android/workspace/helloworld/obj/local/armeabi/objs/nd
kfoo/ndkfoo.o.d.org; fi )
Prebuilt       : libstdc++.a <= <NDK>/sources/cxx-stl/gnu-libstdc++/libs/armeabi
/
cp -f /cygdrive/d/android/android-ndk-r6b/sources/cxx-stl/gnu-libstdc++/libs/arm
eabi/libstdc++.a /cygdrive/d/android/workspace/helloworld/obj/local/armeabi/libs
tdc++.a
SharedLibrary  : libndkfoo.so
/cygdrive/d/android/android-ndk-r6b/toolchains/arm-linux-androideabi-4.4.3/prebu
ilt/windows/bin/arm-linux-androideabi-g++ -Wl,-soname,libndkfoo.so -shared --sys
root=D:/android/android-ndk-r6b/platforms/android-9/arch-arm D:/android/workspac
e/helloworld/obj/local/armeabi/objs/ndkfoo/ndkfoo.o  D:/android/workspace/hellow
orld/obj/local/armeabi/libstdc++.a D:/android/android-ndk-r6b/toolchains/arm-lin
ux-androideabi-4.4.3/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.4.3
/libgcc.a   -Wl,--no-undefined -Wl,-z,noexecstack  -lc -lm -lsupc++ -o D:/androi
d/workspace/helloworld/obj/local/armeabi/libndkfoo.so
Install        : libndkfoo.so => libs/armeabi/libndkfoo.so
mkdir -p /cygdrive/d/android/workspace/helloworld/libs/armeabi
install -p /cygdrive/d/android/workspace/helloworld/obj/local/armeabi/libndkfoo.
so /cygdrive/d/android/workspace/helloworld/libs/armeabi/libndkfoo.so
/cygdrive/d/android/android-ndk-r6b/toolchains/arm-linux-androideabi-4.4.3/prebu
ilt/windows/bin/arm-linux-androideabi-strip --strip-unneeded D:/android/workspac
e/helloworld/libs/armeabi/libndkfoo.so

编辑。

我已经运行了commnad adb shell cat / proc / cpuinfo。这是结果:

Processor       : ARMv6-compatible processor rev 5 (v6l)
BogoMIPS        : 532.48
Features        : swp half thumb fastmult vfp edsp java
CPU implementer : 0x41
CPU architecture: 6TEJ
CPU variant     : 0x1
CPU part        : 0xb36
CPU revision    : 5

Hardware        : GELATO Global board (LGE LGP690)
Revision        : 0000
Serial          : 0000000000000000

我不明白什么swp,半拇指fastmult vfp edsp和java的意思,但我不喜欢'vfp'!!这是否意味着虚拟浮点?那个处理器应该有一个浮点单元......

1 个答案:

答案 0 :(得分:5)

您是对的,-msoft-float-mfloat-abi=soft的同义词(请参阅gcc ARM options列表)并表示浮点仿真。

对于硬件浮点,可以使用以下标志:

LOCAL_CFLAGS += -march=armv6 -marm -mfloat-abi=softfp -mfpu=vfp

要查看您的设备上真正具有的浮点单元,可以检查adb shell cat /proc/cpuinfo命令的输出。有些单位与另一单位兼容:vfp&lt; vfpv3-d16&lt; vfpv3&lt; neon - 如果您有vfpv3,那么vfp也适合您。

您可能还想添加一行

APP_OPTIM := release

进入Application.mk文件。如果清单将android:debuggable设置为“true”,则此设置将覆盖应用程序本机部分的自动“调试”模式

但即使使用所有这些设置,NDK也会将-march=armv5te -mtune=xscale -msoft-float放入编译器选项的开头。如果不对NDK源进行修改,则无法更改此行为(这些选项在文件$NDKROOT\toolchains\arm-linux-androideabi-4.4.3\setup.mk中是硬编码的)。