我在配备 Apple Silicon M1 CPU 的 MacBook Air 上使用 Homebrew 安装了 gcc 11.3.0。该二进制文件是 aarch64 本机版本,而不是 Rosetta 模拟版本。安装的操作系统是 macOS Monterey 12.3。
我在编译使用 ARMv8.2-A SHA-3 扩展指令(M1 CPU 支持)的程序时遇到问题。这是一个最小的可重现示例:
#include <arm_neon.h>
int main() {
uint64x2_t a = {0}, b = {0}, c = {0};
veor3q_u64(a, b, c);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这段代码可以用 Apple 提供的 clang 编译器很好地编译。
我使用 gcc 11 的以下命令行编译它:
gcc-11 -o test test.c -march=armv8-a+sha3
这会导致以下错误:
In file included from test.c:1:
test.c: In function 'main':
/opt/homebrew/Cellar/gcc/11.3.0/lib/gcc/11/gcc/aarch64-apple-darwin21/11/include/arm_neon.h:32320:1: error: inlining failed in call to 'always_inline' 'veor3q_u64': target specific option mismatch
32320 | veor3q_u64 (uint64x2_t __a, uint64x2_t __b, uint64x2_t __c)
| ^~~~~~~~~~
test.c:5:5: note: called from here
5 | veor3q_u64(a, b, c);
| ^~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)
这是这个特定硬件/软件组合中的错误,还是有一些命令行选项我可以传递给 gcc 来编译这个特定程序?
解决了问题。事实证明,gcc 需要-march=armv8.2-a+sha3而不仅仅是-march=armv8-a+sha3编译这个内在函数。事实上,在 gcc 的版本中arm_neon.h,人们可以在内部函数块之前找到它,其中包括veor3q_u64:
#pragma GCC target ("arch=armv8.2-a+sha3")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1519 次 |
| 最近记录: |