在为Android交叉编译FFTW时如何启用硬浮点

在为Android交叉编译FFTW时如何启用硬浮点,android,android-ndk,cross-compiling,Android,Android Ndk,Cross Compiling,我正在尝试为Android编译一个运行在ARM设备上的第三方库()。该库包括一个我想在我的设备上运行的基准测试工具。按照Google关于如何使用NDK r9d配置硬浮点的说明(),我使用以下标志: NDK_ROOT="/opt/android/ndk" TOOLCHAIN="$NDK_ROOT/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/" export SYS_ROOT="$NDK_ROOT/platforms

我正在尝试为Android编译一个运行在ARM设备上的第三方库()。该库包括一个我想在我的设备上运行的基准测试工具。按照Google关于如何使用NDK r9d配置硬浮点的说明(),我使用以下标志:

NDK_ROOT="/opt/android/ndk"
TOOLCHAIN="$NDK_ROOT/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/"

export SYS_ROOT="$NDK_ROOT/platforms/android-18/arch-arm"
export CC="$TOOLCHAIN/arm-linux-androideabi-gcc --sysroot=$SYS_ROOT"
export LD="$TOOLCHAIN/arm-linux-androideabi-ld"
export AR="$TOOLCHAIN/arm-linux-androideabi-ar"
export NM="$TOOLCHAIN/arm-linux-androideabi-nm"
export RANLIB="$TOOLCHAIN/arm-linux-androideabi-ranlib"
export STRIP="$TOOLCHAIN/arm-linux-androideabi-strip"

export CFLAGS="-mfpu=vfpv3-d16 -mhard-float -D_NDK_MATH_NO_SOFTFP=1"
export LDFLAGS="-Wl,-lm_hard -Wl,--no-warn-mismatch"


./configure \
--host=arm-linux-androideabi \
--disable-fortran \
--disable-shared \
--enable-static \
--enable-threads \
--with-combined-threads \
--enable-single \
--prefix=$INSTALL_DIR
在这种配置下,基准测试的性能非常差。在我看来,这个库似乎是用softfloat编译的,或者是链接了softfloat libm

如何将库配置为使用硬浮点?我是否错过了一个重要的步骤


我知道我的设备上的FPU可以工作,因为我有第二台运行ArchLinux的设备,在该设备上库和基准测试的性能与预期一致,即比Android快600%。

我能够解决这个问题。缺了三分

  • 首先,我缺少编译器优化。打开-O2可显著提高性能。因此,CFLAG是

    CFLAGS="-O2 -mfpu=vfpv3-d16 -mhard-float -D_NDK_MATH_NO_SOFTFP=1"
    
  • 第二点是库和平台的特殊性。这篇文章()给出了答案。简言之,添加

    --with-slow-timer 
    
  • 正如@andrewsieh所说,有必要编辑configure,这样libm就不会总是在libm_hard之前链接


  • 为了链接libm_hard.a中数学函数的硬浮点版本,您需要将
    -lm_hard
    放在所有对象文件之后,但放在
    -lm
    之前,后者是Android的libc.so,以软浮点编译
    LDFLAGS=“-Wl,-lm_hard”
    在FFTW中不起作用,因为它放在所有对象文件之前
    LIBS=“-lm_-hard”
    可以工作,但是在末尾配置集合
    LIBS=“-lm$LIBS”
    ,这将
    -lm
    放在
    -lm_-hard
    前面。您可以删除configure to workaround中的这一行,不过更好的修复方法是允许自定义系统数学库,或者在ltmain.sh中过滤掉
    -lm
    ,如果
    -lm\u hard
    存在于
    $host arm-*linux android

    是的,我想出来了,正如您所说,正在编辑configure