提问人:terdev 提问时间:3/19/2022 最后编辑:terdev 更新时间:3/19/2022 访问量:1466
x86-64 SSE2 整数 SIMD GCC 内置函数是否有 ARM64 等效项?
Are there ARM64 equivalents for x86-64 SSE2 integer SIMD GCC built-in functions?
问:
我正在尝试使用 AMM 算法(近似矩阵乘法;在 Apple 的 M1 上),它完全基于速度并使用下面列出的 x86 内置函数。由于将 VM 用于 x86 会减慢算法中的几个关键进程,我想知道是否有另一种方法可以在 ARM64 上运行它。
我也找不到 ARM64 内置函数的合适文档,这最终可以帮助映射一些 x86-64 指令。
使用的内置函数:
__builtin_ia32_vec_init_v2si
__builtin_ia32_vec_ext_v2si
__builtin_ia32_packsswb
__builtin_ia32_packssdw
__builtin_ia32_packuswb
__builtin_ia32_punpckhbw
__builtin_ia32_punpckhwd
__builtin_ia32_punpckhdq
__builtin_ia32_punpcklbw
__builtin_ia32_punpcklwd
__builtin_ia32_punpckldq
__builtin_ia32_paddb
__builtin_ia32_paddw
__builtin_ia32_paddd
答:
通常,您会使用内部函数而不是原始 GCC 内置函数,但请参阅 https://gcc.gnu.org/onlinedocs/gcc/ARM-C-Language-Extensions-_0028ACLE_0029.html。和函数似乎没有像 x86 那样记录在 GCC 手册中,这只是它们不打算直接使用的另一个迹象。__builtin_arm_...
__builtin_aarch64_...
__builtin_aarch64_saddl2v16qi
另请参见 https://developer.arm.com/documentation/102467/0100/Why-Neon-Intrinsics- re intrinsics 和 。GCC 提供了该标头的一个版本,其中包含使用 GCC 内置实现的文档内部函数 API。#include <arm_neon.h>
__builtin_aarch64_...
就可移植性库而言,AFAIK 不是来自原始内置,而是 SIMDe (https://github.com/simd-everywhere/simde) 具有 immintrin.h
Intel 内部函数的可移植实现,如 _mm_packs_epi16
。大多数代码应该使用该 API 而不是 GNU C 内置函数,除非您使用 GNU C 原生向量 ( 用于没有任何特定于 ISA 的东西的可移植 SIMD。但是,当您想利用特殊洗牌之类的东西时,这是不可行的。__attribute__((vector_size(16)))
是的,ARM 确实有 (https://developer.arm.com/documentation/dui0473/m/neon-instructions/vqmovn-and-vqmovun) 等指令的饱和度变窄,因此 SIMDe 可以有效地模拟包指令。那是 AArch32,而不是 64,但希望有一个等效的 AArch64 指令。vqmovn
评论
paddb/w/d
#include <arm_neon.h>
__builtin_aarch64_...
immintrin.h
_mm_packs_epi16
vqmovn
pack