如何设置优化级别Android中NDK特定的文件?(How to set optimization

2019-10-17 06:13发布

我有一个Android的原生库,有一些文件,其中包括NEON汇编代码。 我继承了这个代码一些其他的编码器,并给我的关于NEON汇编编码知识(或任何组件,对于这个问题)是轻薄的,至少可以这样说。 总之,我注意到以下问题:当我与“NDK-建立NDK_DEBUG = 1”编译,一切都很好。 当我编译为释放,“NDK-建立NDK_DEBUG = 0”,则编译器优化远的汇编代码。 我已经成功通过黑客NDK构建脚本,并分裂我的图书馆为两个,其中一个解放运动在其中的所有装配文件解决问题 - 这LIB我在一个非常哈克的方式将优化设置为“-O0” 。 所以,问题是:我怎么可以指定一个特定的文件的优化级别? 设置APP_OPTIM在Application.mk完成,影响到所有的编译文件。 如此做NDK_DEBUG标志。

编辑:根据Alex的要求,这里的Android.mk我结束了使用,分裂lib放到二:一部分用汇编代码(和-O0),另一部分与普通的C代码(-02):

LOCAL_PATH := $(call my-dir)

# assembly_neon_code_here (neon) module - turn optimization off
include $(CLEAR_VARS)

LOCAL_MODULE := assembly_neon_code_here
LOCAL_SRC_FILES := assembly_neon_code_here.cpp
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
    LOCAL_ARM_NEON := true
endif

LOCAL_CFLAGS := -O0
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog 
include $(BUILD_SHARED_LIBRARY)

# main module
include $(CLEAR_VARS)

LOCAL_MODULE    := complete_lib
LOCAL_SRC_FILES := regular_src1.cpp regular_src2.cpp regular_src3.cpp 
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
    LOCAL_ARM_NEON := true
endif

# allow logcat calls
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog -lz
LOCAL_SHARED_LIBRARIES := assembly_neon_code_here
include $(BUILD_SHARED_LIBRARY)

Answer 1:

GCC> = 4.4似乎支持#pragma GCC optimize更改优化级别中期的文件,并属性optimize设置它每功能。

见http://gcc.gnu.org/onlinedocs/gcc-4.4.7/gcc/Function-Specific-Option-Pragmas.html#Function-Specific-Option-Pragmas和http://gcc.gnu.org/onlinedocs /gcc-4.4.7/gcc/Function-Attributes.html#Function-Attributes 。

根据这些链接,投入#pragma GCC optimize ("O0")在导致该问题应该可以解决问题的文件的顶部。



Answer 2:

我不知道如何改变每个文件的优化级别,但这样做可能会损害您的应用程序的性能,所以我不会推荐它安韦。 我假定汇编代码是在联汇编块的形式,装配编码器即块交织与正常C或C ++代码。 它看起来如下

asm {
  .. assembly goes here, usually each line in double-quotes, often ending in \n\t
  : ... input operands. Might not be present ...
  : ... output operands. Might not be present ...
  : ... clobber operands. Might not be present ...
}

最有可能的原因,编译器会删除内联汇编块,如果它不包含任何输出操作数,或者如果输出操作数是所有未使用。 您可以通过标记内联汇编块为避免尝试volatile告诉编译器不要惹它。 要做到这一点,只需写volatileasm关键字。

从与内联汇编块搞乱阻碍编译器的另一件事是将“记忆”他们撞名单。 这告诉组件读取或写入到任意的内存地址的编译器。 虽然你在它,还加上“抄送”的好办法。 这告诉编译器的内联汇编混乱与条件码寄存器,即它执行了影响以后条件分支指令的行为测试说明。

总之,尽量使所有的内联汇编块这个样子

asm volatile {
  .. whatever ...
  : ... whatever ...
  : ... whatever ...
  : ... whatever ..., "cc", "memory"
}

需要注意的是asm也可拼写__asm__ ,而volatile也可以拼写__volatile__



文章来源: How to set optimization level for a specific file in Android NDK?