如何在Android NDK项目中获得ARM NEON点生产“ UDOT”指令支持?

问题描述

我正在一台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支持吗?谢谢!

解决方法

  1. 据我所知,MRS是非用户模式的唯一指令。
  2. NDK r14b是从2017年3月开始的,第一年发布了armv8.2-a
    因此,我怀疑编译器是否支持armv8.2-a
    您应该尝试r17c或更高版本。