我的代码:
#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
配置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
两种配置的注释:
我通过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的速度慢得多。
我的假设:
我的线程以某种方式卡在其中一个Cortex-A7内核上而不是跳到其中一个Cortex-A15内核上。如果可能出现这种情况,我该怎么做才能确保这种情况或者如何强制我的线程进入Cortex-A15内核?
我未能设置CPU时钟频率下限并且CPU正在受到限制。如果是这种情况,我怎样才能确保是这种情况?
与CM相比,三星的内核更糟糕。这会导致执行时间的这么大差异吗?
我在这一点上非常难过。您有什么建议和见解,以便我可以从这个设备中获得我的钱?
编辑:我刷了一个自定义调整的内核(http://forum.xda-developers.com/showthread.php?t=2725193),并将调控器设置为performance
,执行时间下降到 1.3秒,所以我认为我的第三个假设现在有点强。它仍然比旧的CPU慢......