Сборка релизной версии проекта с Android NDK r6 - PullRequest
1 голос
/ 21 сентября 2011

Я собираю пример helloworld для Android NDK r6b, используя cygwin и Windows Vista.Я заметил, что следующий код занимает от 14 до 20 мсек на моем телефоне Android (он имеет 800 МГц процессор 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,4 ГГц ноутбуке это занимает.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 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

Я не понимаю, что означает swf, half thumb fastmult vfp edsp и java, но мне не нравится этот vfp !!Означает ли это виртуальные плавающие точки?Этот процессор должен иметь единицу с плавающей запятой ...

1 Ответ

5 голосов
/ 21 сентября 2011

Вы правы, -msoft-float является синонимом для -mfloat-abi=soft (см. Список параметров gcc ARM ) и означает эмуляцию с плавающей запятой.

Для аппаратных с плавающей запятой следующие флагиможно использовать:

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

Чтобы увидеть, какие единицы с плавающей запятой у вас действительно есть на вашем устройстве, вы можете проверить вывод команды adb shell cat /proc/cpuinfo.Некоторые устройства совместимы с другими: vfp <<code>vfpv3-d16 <<code>vfpv3 <<code>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).

...