问题描述
我正在一台Snapdragon 845手机上使用ARM NEON构建一个android NDK项目。
在阅读帖子https://community.arm.com/developer/tools-software/tools/b/tools-software-ides-blog/posts/exploring-the-arm-dot-product-instructions之后,我想使用UDOT
进行卷积。但是,UDOT
指令无法识别。我尝试了代码
static unsigned long long read_id_aa64isar0()
{
unsigned long long id_aa64isar0;
__asm ("MRS %x0,ID_AA64ISAR0_EL1 \n" : "=r" (id_aa64isar0) );
return (id_aa64isar0);
}
static bool dot_product_supported()
{
if (read_id_aa64isar0() & 0x0000100000000000ULL)
return true;
else
return false;
}
要尝试确认对点产品的支持,它将报告错误Illegal instruction
。
我的Application.mk文件就像
APP_STL := c++_static
NDK_TOOLCHAIN_VERSION := clang
APP_PLATFORM := android-21
APP_ABI := arm64-v8a
我的Android.mk的标志就像
LOCAL_ARM_NEON := true
LOCAL_CFLAGS += -march=armv8.2-a -Werror -O3
LOCAL_CFLAGS += -fopenmp
LOCAL_LDFLAGS += -fopenmp
我尝试将-march=armv8-a
更改为-march=armv8.2-a
,但报告错误error: unkNown value 'armv8.2-a' for -march
。
我使用的NDK版本是r14b
。我可以知道如何获得对UDOT
的支持吗?谢谢!
解决方法
- 据我所知,
MRS
是非用户模式的唯一指令。 - NDK
r14b
是从2017年3月开始的,第一年发布了armv8.2-a
。
因此,我怀疑编译器是否支持armv8.2-a
。
您应该尝试r17c
或更高版本。