x86-64 SSE2 整数 SIMD GCC 内置函数是否有 ARM64 等效项?
Are there ARM64 equivalents for x86-64 SSE2 integer SIMD GCC built-in functions?
我正在尝试使用 AMM 算法(近似矩阵乘法;在 Apple 的 M1 上),它完全基于速度并使用下面列出的 x86 内置函数。由于为 x86 使用 VM 会减慢算法中的几个关键进程,我想知道是否有另一种方法可以在 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。 __builtin_arm_...
和 __builtin_aarch64_...
函数,如 __builtin_aarch64_saddl2v16qi
似乎没有像 x86 那样记录在 GCC 手册中,这只是它们不适合直接使用的另一个标志。
另请参阅 https://developer.arm.com/documentation/102467/0100/Why-Neon-Intrinsics- re 内在函数和 #include <arm_neon.h>
。 GCC 提供了 header 的一个版本,其中记录的内部函数 API 使用 __builtin_aarch64_...
GCC 内置函数实现。
就可移植性库而言,AFAIK 不是来自原始内置函数,而是 SIMDe (https://github.com/simd-everywhere/simde) 具有 immintrin.h
英特尔内在函数的可移植实现,例如 _mm_packs_epi16
。大多数代码应该使用 API 而不是 GNU C 内置函数,除非你使用 GNU C 本机向量(__attribute__((vector_size(16)))
用于没有任何 ISA-specific 东西的便携式 SIMD。但是当你使用时这是不可行的想利用特殊的洗牌和东西。
是的,ARM 确实通过 vqmovn
(https://developer.arm.com/documentation/dui0473/m/neon-instructions/vqmovn-and-vqmovun) 等指令实现了饱和收缩,因此 SIMDe 可以有效地模拟打包指令。那是 AArch32,不是 64,但希望有一个等效的 AArch64 指令。
我正在尝试使用 AMM 算法(近似矩阵乘法;在 Apple 的 M1 上),它完全基于速度并使用下面列出的 x86 内置函数。由于为 x86 使用 VM 会减慢算法中的几个关键进程,我想知道是否有另一种方法可以在 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。 __builtin_arm_...
和 __builtin_aarch64_...
函数,如 __builtin_aarch64_saddl2v16qi
似乎没有像 x86 那样记录在 GCC 手册中,这只是它们不适合直接使用的另一个标志。
另请参阅 https://developer.arm.com/documentation/102467/0100/Why-Neon-Intrinsics- re 内在函数和 #include <arm_neon.h>
。 GCC 提供了 header 的一个版本,其中记录的内部函数 API 使用 __builtin_aarch64_...
GCC 内置函数实现。
就可移植性库而言,AFAIK 不是来自原始内置函数,而是 SIMDe (https://github.com/simd-everywhere/simde) 具有 immintrin.h
英特尔内在函数的可移植实现,例如 _mm_packs_epi16
。大多数代码应该使用 API 而不是 GNU C 内置函数,除非你使用 GNU C 本机向量(__attribute__((vector_size(16)))
用于没有任何 ISA-specific 东西的便携式 SIMD。但是当你使用时这是不可行的想利用特殊的洗牌和东西。
是的,ARM 确实通过 vqmovn
(https://developer.arm.com/documentation/dui0473/m/neon-instructions/vqmovn-and-vqmovun) 等指令实现了饱和收缩,因此 SIMDe 可以有效地模拟打包指令。那是 AArch32,不是 64,但希望有一个等效的 AArch64 指令。