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

发布于 2024-12-05 21:56:01 字数 4618 浏览 2 评论 0原文

我正在使用 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 笔记本上,它需要 0.45 毫秒(系统启动时的计时)充满了其他正在运行的程序,例如 Chrome、2/3 ides、.pdf 打开等...)。我想知道 helloworld 应用程序是否构建为发布版本。我注意到 g++ 是用 -msoft-float 调用的

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

这就是 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、halfthumb fastmult vfp edsp 和 java 是什么意思,但我不喜欢那个“vfp”!这是否意味着虚拟浮点?该处理器应该有一个浮点单元......

I am compiling helloworld example of Android NDK r6b using cygwin and Windows Vista. I have noticed that the following code takes between 14 and 20 mseconds on my Android phone (it has an 800mhz CPU Qualcomm MSM7227T chipset, with hardware floating point support):

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);

On my 2.4ghz notebook it takes .45 msec (timings taken when the system is full of other programs running, like Chrome, 2/3 ides, .pdf opens etc...). I wonder if the helloworld application is builded as a release version. I noticed that g++ get called with

-msoft-float.

Does this means that it is using floating point emulations?
What command line options i need to use in order to build an optimized version of the program? How to specify those options?

This is how g++ get called.:

/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

Edit.

I have run the commnad adb shell cat /proc/cpuinfo. This is the result:

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

I don't understand what swp, half thumb fastmult vfp edsp and java means, but i don't like that 'vfp'!! Does it means virtual-floating points? That processor should have a floating point unit...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

是你 2024-12-12 21:56:01

你是对的,-msoft-float-mfloat-abi=soft的同义词(参见gcc列表ARM 选项),表示浮点仿真。

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

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

要查看设备上实际拥有的浮点单元,您可以检查 adb shell cat /proc/cpuinfo 命令的输出。有些单位与另一个单位兼容:vfp vfp vfp vfp vfp vfpv3-d16 < vfpv3 < 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 中)。

You are right, -msoft-float is a synonym for -mfloat-abi=soft (see list of gcc ARM options) and means floating point emulation.

For hardware floating point the following flags can be used:

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

To see what floating point unit you really have on your device you can check the output of adb shell cat /proc/cpuinfo command. Some units are compatible with another: vfp < vfpv3-d16 < vfpv3 < neon - so if you have vfpv3, then vfp also works for you.

Also you might want to add the line

APP_OPTIM := release

into your Application.mk file. This setting overrides automatic 'debug' mode for native part of application if the manifest sets android:debuggable to 'true'

But even with all these settings NDK will put -march=armv5te -mtune=xscale -msoft-float into the beginning of compiler options. And this behavior can not be changed without modifications in NDK sources (these options are hardcoded in file $NDKROOT\toolchains\arm-linux-androideabi-4.4.3\setup.mk).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文