如何在Android NDK项目中获得ARM霓虹灯点生产(“UDOT”)指令支持?

如何在Android NDK项目中获得ARM霓虹灯点生产(“UDOT”)指令支持?,arm,neon,Arm,Neon,我正在一部Snapdragon 845手机上使用ARM NEON构建一个android NDK项目 读完这篇文章后,我想用UDOT做卷积运算。但是,UDOT指令无法识别。我试过密码 static unsigned long long read_id_aa64isar0() { unsigned long long id_aa64isar0; __asm ("MRS %x0, ID_AA64ISAR0_EL1 \n" : "=r" (id_aa64is

我正在一部Snapdragon 845手机上使用ARM NEON构建一个android NDK项目

读完这篇文章后,我想用
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;
}
要尝试确认dot产品支持,它会报告错误
非法指令

我的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
,但它报告了错误
错误:未知值“armv8.2-a”表示-march

我使用的NDK版本是
r14b
。我可以知道如何获得对
UDOT
的支持吗?谢谢大家!

  • 据我所知,
    MRS
    是一种仅限非用户模式的指令
  • NDK
    r14b
    于2017年3月推出,同年推出了第一批
    armv8.2-a

    因此,我怀疑编译器是否支持
    armv8.2-a

    您应该尝试
    r17c
    或更高版本

  • 这是编译时还是运行时的错误?我想知道您的汇编程序是否知道
    ID\u AA64ISAR0\u EL1
    @NateEldredge Hi-Nate,
    非法指令
    错误在运行时。如果我将
    -march=armv8-a
    更改为
    -march=armv8.2-a
    ,则
    错误:未知值'armv8.2-a'for-march
    错误在编译时。你好,杰克,非常感谢。正如您所建议的,我将r14b切换到r18b,然后如上所述更新Application.mk和Android.mk。(更改在原始帖子中更新。)然后构建成功。不再出现
    错误:三月的未知值“armv8.2-a”。
    显示。但是我在运行代码时仍然得到了
    非法指令。你知道为什么吗?谢谢大家!@正如我上面所说的,KathyLee
    mrs
    很可能是一条仅限非用户模式的指令,这意味着它仅在超级用户、异常/中断模式下有效。所有Android应用程序都在用户模式下运行,除非你对设备进行了修改,这在现在几乎是不可能/不可行的。谢谢!事实上,我正在使用devboard,所以我想我是超级用户?我终于让它运行了,因为我换成了Snapdragon 855。845太旧了,无法运行…谢谢!