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

Optimization 使用Android NDK r6构建项目的发布版本,optimization,floating-point,android-ndk,Optimization,Floating Point,Android Ndk,我正在使用cygwin和WindowsVista编译Android NDKR6B的helloworld示例。我注意到,在我的Android手机上,以下代码需要14到20毫秒。它有一个800mhz CPU高通公司MSM7227T芯片组,支持硬件浮点运算: float *v1, *v2, *v3, tot; int num = 50000; v1 = new float[num]; v2 = new float[num]; v3 = new float[num]; // Initia

我正在使用cygwin和WindowsVista编译Android NDKR6B的helloworld示例。我注意到,在我的Android手机上,以下代码需要14到20毫秒。它有一个800mhz CPU高通公司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);
我不明白swp、半拇指fastmult vfp edsp和java是什么意思,但我不喜欢那个“vfp”!!它是指虚拟浮点吗?处理器应该有一个浮点单元…

你说得对,-msoft float是-mfloat abi=soft的同义词参见gcc列表,它表示浮点仿真

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

LOCAL_CFLAGS += -march=armv6 -marm -mfloat-abi=softfp -mfpu=vfp
要查看设备上的浮点单位,可以检查adb shell cat/proc/cpuinfo命令的输出。有些装置与另一个装置兼容:vfp 此外,您可能还需要添加行

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

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

没错,-msoft float是-mfloat abi=soft的同义词参见gcc列表,表示浮点仿真

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

LOCAL_CFLAGS += -march=armv6 -marm -mfloat-abi=softfp -mfpu=vfp
要查看设备上的浮点单位,可以检查adb shell cat/proc/cpuinfo命令的输出。有些装置与另一个装置兼容:vfp 此外,您可能还需要添加行

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


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

它应该是-mfloat abi=硬的吗?而且,如果它开始使用硬件浮点,我必须重新编译我正在使用的所有库,比如gnustl_static,对吗?实际上,NDK编译器不支持-mfloat abi=hard。因此-mfloat abi=softfp是硬件浮点的唯一选项。您不需要重新编译所有的库——感谢SoFTFP调用约定。我希望看到G+生成的汇编代码与C++代码交错。我使用了-S选项,但只能看到汇编代码。你知道我可以使用什么选项吗?太多了!但是,在检查helloworld\obj\local\armeabi\objs\ndkfoo目录下的汇编代码时,我看到了以下类型的指令:bl u aeabi fmul、bl u aeabi idiv等等。我不知道ARM指令集,但从官方架构参考文档的简要介绍来看,它似乎仍然在使用软件浮点。我错过什么了吗?这与您的评论有关吗?感谢softfp调用约定?对于交错asm和C源,您可以尝试使用-g-Wa,-ahl=outfile.s选项而不是-s。如果模拟浮点,则应在s文件顶部看到行.fpu softvfp。您可能还需要-marm选项或在Android.mk中为您的文件添加.arm后缀。我不确定thumb代码是否可以在ARMV6上使用浮点指令,它应该是-mfloat abi=hard吗?而且,如果它开始使用硬件浮点,我必须重新编译我正在使用的所有库,比如gnustl_static,对吗?实际上,NDK编译器不支持-mfloat abi=hard。因此-mfloat abi=softfp是硬件浮点的唯一选项。您不需要重新编译所有的库——感谢SoFTFP调用约定。我希望看到G+生成的汇编代码与C++代码交错。我使用了-S选项,但只能看到汇编代码。你知道我可以使用什么选项吗?太多了!但是,在检查helloworld\obj\local\armeabi\objs\ndkfoo目录下的汇编代码时,我看到了以下类型的指令:bl u aeabi fmul、bl u aeabi idiv等等。我不知道ARM指令集,但从官方架构参考文档的简要介绍来看,它似乎仍然在使用软件浮点。我错过什么了吗?这与您的评论有关吗?感谢softfp调用约定?对于交错asm和C源,您可以尝试使用-g-Wa,-ahl=outfile.s选项而不是-s。如果模拟浮点,则应在s文件顶部看到行.fpu softvfp。你很可能是肌萎缩侧索硬化症 o need-marm选项或在Android.mk中为您的文件添加.arm后缀我不确定thumb代码是否可以在armv6上使用浮点指令