为什么Exynos Octa 5420异常缓慢

时间:2014-11-02 21:13:42

标签: android c++ performance android-ndk arm

我的代码:

#include<ctime>
#include<cstdio>

int main(){
    struct timespec t,mt1,mt2;
    unsigned long long int mt;

    clock_gettime(CLOCK_THREAD_CPUTIME_ID,&mt1);

    //Measured block begin
    for(int i=0;i<1000000;i++)
        clock_gettime(CLOCK_THREAD_CPUTIME_ID,&t);
    //Measured block end

    clock_gettime(CLOCK_THREAD_CPUTIME_ID,&mt2);
    mt = (mt2.tv_sec - mt1.tv_sec)*1000000000LL + mt2.tv_nsec - mt1.tv_nsec;

    printf("%lld\n",mt);

    return 0;
}

我正在使用Android NDK r9d生成的独立arm-v7a工具链,该工具链位于/opt/android-toolchain下。

配置1:

这些是https://github.com/taka-no-me/android-cmake中工具链文件生成的默认标志。

编译器配置:

/opt/android-toolchain/bin/arm-linux-androideabi-g++ \
    -DANDROID -Wno-psabi --sysroot=/opt/android-toolchain/sysroot \
    -fpic -funwind-tables -finline-limit=64 -fsigned-char \
    -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp \
    -mfpu=vfpv3-d16 -fdata-sections -ffunction-sections \
    -Wa,--noexecstack  -mthumb -fomit-frame-pointer \
    -fno-strict-aliasing -O3 -DNDEBUG \
    -isystem /opt/android-toolchain/sysroot/usr/include \
    -isystem /opt/android-toolchain/include/c++/4.8 \
    -isystem /opt/android-toolchain/include/c++/4.8/arm-linux-androideabi/armv7-a \
    -o my-object-file.o -c my-source-file.cpp

链接器配置:

/opt/android-toolchain/bin/arm-linux-androideabi-gcc \
    -Wno-psabi --sysroot=/opt/android-toolchain/sysroot \
    -fpic -funwind-tables -finline-limit=64 -fsigned-char \
    -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp \
    -mfpu=vfpv3-d16 -fdata-sections -ffunction-sections \
    -Wa,--noexecstack  -mthumb -fomit-frame-pointer \
    -fno-strict-aliasing -O3 -DNDEBUG -Wl,--fix-cortex-a8 \
    -Wl,--no-undefined -Wl,-allow-shlib-undefined -Wl,--gc-sections \
    -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now \
    -Wl,-z,nocopyreloc my-object-file.o -o my-executable \
    -L/libs/armeabi-v7a -rdynamic \
    "/opt/android-toolchain/arm-linux-androideabi/lib/armv7-a/thumb/libstdc++.a" \
    "/opt/android-toolchain/arm-linux-androideabi/lib/armv7-a/thumb/libsupc++.a" \
    -lm
  1. 三星Galaxy Note 10.1 2014年版 Exynos Octa 5420 @ 1.9 Ghz 运行三星股票4.4.2 ROM,代码 2.0秒
  2. 三星Galaxy Note II与 Exynos 4412 @ 1.6 GHz 运行基于Android 4.4.4的CyanogenMod 11,代码需 0.75秒
  3. 三星Galaxy S3与 Exynos 4412 @ 1.4 Ghz 运行基于Android 4.4.4的CyanogenMod 11,代码需要 1.1秒
  4. 配置2:

    几乎所有以前的标志都被移除。

    编译器配置:

    /opt/android-toolchain/bin/arm-linux-androideabi-g++ \
        -DANDROID --sysroot=/opt/android-toolchain/sysroot \
        -O3 -DNDEBUG \
        -isystem /opt/android-toolchain/sysroot/usr/include \
        -isystem /opt/android-toolchain/include/c++/4.8 \
        -isystem /opt/android-toolchain/include/c++/4.8/arm-linux-androideabi/armv7-a \
        -o my-object-file.o -c my-source-file.cpp
    

    链接器配置:

    /opt/android-toolchain/bin/arm-linux-androideabi-gcc \
        --sysroot=/opt/android-toolchain/sysroot -O3 -DNDEBUG \
        -Wl,-z,nocopyreloc my-object-file.o -o my-executable \
        -L/libs/armeabi-v7a -rdynamic \
        "/opt/android-toolchain/arm-linux-androideabi/lib/armv7-a/thumb/libstdc++.a" \
        "/opt/android-toolchain/arm-linux-androideabi/lib/armv7-a/thumb/libsupc++.a" \
        -lm
    
    1. 三星Galaxy Note 10.1 2014年版 Exynos Octa 5420 @ 1.9 Ghz 运行三星股票4.4.2 ROM,代码 2.2秒
    2. 三星Galaxy Note II与 Exynos 4412 @ 1.6 GHz 运行基于Android 4.4.4的CyanogenMod 11,代码 0.94秒
    3. 三星Galaxy S3与 Exynos 4412 @ 1.4 Ghz 运行基于Android 4.4.4的CyanogenMod 11,代码需要 1.1秒
    4. 两种配置的注释:

      • 我通过CPU调整应用程序将最低CPU时钟频率设置为最高,即1.9 Ghz。

      • 我确保没有后台进程占用CPU。

      • 我也特意尝试-mcpu=cortex-a15标志,不会显着改变执行时间。

      • 同样尝试-mfpu=neon -marm -mtune=cortex-a15,不会显着改变执行时间。

      • clock_gettime()不是罪魁祸首,代码明显变慢。

      • 我尝试过的其他代码段,包括OpenCV imgproc的部分内容以及std::map::find()std::sort()等STL调用都明显clock_gettime()与我上面列出的其他两个相比,Exynos Octa 5420的速度慢得多

      我的假设:

      1. 我的线程以某种方式卡在其中一个Cortex-A7内核上而不是跳到其中一个Cortex-A15内核上。如果可能出现这种情况,我该怎么做才能确保这种情况或者如何强制我的线程进入Cortex-A15内核?

      2. 我未能设置CPU时钟频率下限并且CPU正在受到限制。如果是这种情况,我怎样才能确保是这种情况?

      3. 与CM相比,三星的内核更糟糕。这会导致执行时间的这么大差异吗?

      4. 我在这一点上非常难过。您有什么建议和见解,以便我可以从这个设备中获得我的钱?

        编辑:我刷了一个自定义调整的内核(http://forum.xda-developers.com/showthread.php?t=2725193),并将调控器设置为performance,执行时间下降到 1.3秒,所以我认为我的第三个假设现在有点强。它仍然比旧的CPU慢......

0 个答案:

没有答案