考虑以下源文件test-sha512.c
,在Arm64(aarch64)上使用SHA512内部函数:
#include <arm_neon.h>
const uint64_t data[256] = {0,};
void test()
{
uint64x2_t a = vld1q_u64(data);
a = vsha512h2q_u64(a, a, a);
}
在Ubuntu 22.10(MacBook M1上的虚拟机),与gcc 12.2.0,我有错误“内联失败调用'always_inline'”和“目标特定选项不匹配”:
$ gcc -c test-sha512.c -march=armv8-a+sha3
In file included from test-sha512.c:1:
/usr/lib/gcc/aarch64-linux-gnu/12/include/arm_neon.h: In function ‘test’:
/usr/lib/gcc/aarch64-linux-gnu/12/include/arm_neon.h:29671:1: error: inlining failed in call to ‘always_inline’ ‘vsha512h2q_u64’: target specific option mismatch
29671 | vsha512h2q_u64 (uint64x2_t __a, uint64x2_t __b, uint64x2_t __c)
| ^~~~~~~~~~~~~~
test-sha512.c:7:9: note: called from here
7 | a = vsha512h2q_u64(a, a, a);
| ^~~~~~~~~~~~~~~~~~~~~~~
/usr/lib/gcc/aarch64-linux-gnu/12/include/arm_neon.h:29671:1: error: inlining failed in call to ‘always_inline’ ‘vsha512h2q_u64’: target specific option mismatch
29671 | vsha512h2q_u64 (uint64x2_t __a, uint64x2_t __b, uint64x2_t __c)
| ^~~~~~~~~~~~~~
test-sha512.c:7:9: note: called from here
7 | a = vsha512h2q_u64(a, a, a);
| ^~~~~~~~~~~~~~~~~~~~~~~
使用clang 15.0.6,它可以正确编译,使用Arm64 intrinsic并使用clang编译的完整SHA512实现也可以正确工作。
$ clang -c test-sha512.c -march=armv8-a+sha3
注意:Arm架构为SHA1、SHA256、SHA512和SHA3定义了不同的特性。然而,gcc和clang只知道crypto
、sha2
和sha3
。SHA512指令(SHA2的加密部分)是用sha3
激活的。奇怪。总之...
用于AES、SHA1和SHA256的类似的Arm64 intrinsic可以用gcc正确编译。该问题是SHA512特有的。
其他测试,未成功,相同错误:
- 错误“目标特定选项不匹配”可能表明对
-march
选项的误解。我尝试了所有Armv8选项(-march=armv8-a+fp+simd+crypto+crc+lse+fp16+rcpc+rdma+dotprod+aes+sha2+sha3+sm4+fp16fml+sve+profile+rng+memtag+sb+ssbs+predres+sve2+sve2-sm4+sve2-aes+sve2-sha3+sve2-bitperm+tme+i8mm+f32mm+f64mm+bf16+flagm+pauth+ls64+mops
)和-march=armv9-a
。 - 使用
-march=native
,考虑到M1支持SHA512。 - 使用
-mcpu=neoverse-v1
或-mcpu=neoverse-n2
或其他已知的支持SHA512的Arm内核。 - 各种类型的优化选项。
- 尝试了
gcc --target-help
的各种(但不是全部)建议。
这是一个已知错误吗?我在网上没有找到任何关于Arm64 SHA512 intrinsics上这个错误的参考。
编辑:SHA256的内部函数也会因为同样的错误而失败。只有SHA1的内部函数可以工作。我之前对SHA256的测试是使用clang进行的,对不起。
编辑2:SHA256 intrinsic适用于-march=armv8-a+sha2+crypto
,但不适用于-march=armv8-a+sha2
。SHA512仍然不适用,即使适用于所有-march
选项。
1条答案
按热度按时间kx7yvsdv1#
SHA 3/SHA 512扩展由ARM文档化,仅适用于ARMv8.2-A以上版本。因此,gcc要求您使用
-march=armv8.2-a+sha3
(或v8.3-a
等)