stream5.10 在ARM64平台上 gcc10默认打开lse指令支持编译无法通过

常用编译指令

gcc -O2 -fopenmp -DSTREAM_ARRAY_SIZE=357800000 -DNTIMES=10 -mcmodel=large -fno-PIC -o stream8g stream.c

报错日志如下

/usr/lib/gcc/aarch64-linux-gnu/10.3.1/libgcc.a(lse-init.o): in function `init_have_lse_atomics':
(.text.startup+0x14): relocation truncated to fit: R_AARCH64_ADR_PREL_PG_HI21 against `.bss'
/usr/lib/gcc/aarch64-linux-gnu/10.3.1/libgcc.a(ldadd_4_1.o): in function `__aarch64_ldadd4_relax':
(.text+0x4): relocation truncated to fit: R_AARCH64_ADR_PREL_PG_HI21 against symbol `__aarch64_have_lse_atomics' defined in .bss section in /usr/lib/gcc/aarch64-linux-gnu/10.3.1/libgcc.a(lse-init.o)
collect2: error: ld returned 1 exit status

原因分析

使用-fopenmp指令的含义是:使用 omp 功能,适应多处理器环境,开启后程序默认线程数为CPU线程数,可以通过环境变量 OMP_NUM_THREADS 指定线程数;
合理推测,多核多线程环境下,就会使用到锁,lse这个东西是ARM64的一个原子指令,常用于锁。那去掉-fopenmp是否可以编译过呢,实验确实是可以的。那么可能就是对多线程支持的问题了。
报错的打印中,编译器尝试使用lse这个原子指令。lse是在ARMv8.1的时候开始支持的。
而我编译的平台是支持ARMv8.1指令集的,不清楚为什么也会报错,对于编译器的知识积累较少,暂时无法理解编译报错的具体原因。
那我分析是否是编译器或者libc库有关系,查阅ARM官方文档介绍:
https://learn.arm.com/learning-paths/servers-and-cloud-computing/lse/intro/
在这里插入图片描述
gcc版本肯定是支持的
在这里插入图片描述
我使用的是欧拉22系列版本系统,应该也不存在库的问题。
那么是否编译指令?需要显式支持lse?
gcc是支持enable or disable这个指令支持的
在这里插入图片描述
通过gcc官网也可以看到对于这两个选项与lse指令支持的相关说明:
https://gcc.gnu.org/onlinedocs/gcc/AArch64-Options.html
在这里插入图片描述
在这个编译选项上试试看看:

gcc -O2 -fopenmp -DSTREAM_ARRAY_SIZE=357800000 -DNTIMES=10 -mcmodel=large -fno-PIC -mno-outline-atomics -o stream8g stream.c
gcc -O2 -fopenmp -DSTREAM_ARRAY_SIZE=357800000 -DNTIMES=10 -mcmodel=large -fno-PIC -march=armv8.1-a -o stream8g stream.c

真可以编译过。
那就先用着吧,其他原因等后面有空再查。猜测这个编译选项大概率会影响性能,毕竟是跟原子操作有关系。
在搜索资料的时候看到一篇博客也挺有意思:
https://zhuanlan.zhihu.com/p/668192698

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值