登录
注册
开源
企业版
高校版
搜索
帮助中心
使用条款
关于我们
开源
企业版
高校版
私有云
模力方舟
登录
注册
9月20日,Gitee × 模力方舟来成都了!聚焦 AI 应用在开发范式、算力架构、交互设计、硬件选型等跨场景创新实践,点击立即报名~
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
取消
前往登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
Watch
不关注
关注所有动态
仅关注版本发行动态
关注但不提醒动态
22
Star
28
Fork
162
src-openEuler
/
gcc
代码
Issues
27
Pull Requests
9
Wiki
统计
流水线
服务
JavaDoc
PHPDoc
质量分析
Jenkins for Gitee
腾讯云托管
腾讯云 Serverless
悬镜安全
阿里云 SAE
Codeblitz
SBOM
我知道了,不再自动展开
更新失败,请稍后重试!
移除标识
内容风险标识
本任务被
标识为内容中包含有代码安全 Bug 、隐私泄露等敏感信息,仓库外成员不可访问
openEuler-20.03-LTS-SP3版本与openEuler-22.03-LTS版本x86上gcc参数差异导致编译出的二进制性能下降
已完成
#I7YRN6
任务
const
创建于
2023-09-05 17:06
版本切换时遇到两个影响性能的问题: 一、两个gcc版本的默认参数 max-inline-insns-single 不一样, gcc7.3是 400 , gcc10.3 只有70, 触发限制导致了inline失败。inline失败编译的二进制会导致性能下降。 有两个问题希望得到解答: 1、开源为什么会有max-inline-insns-single参数变更? 2、社区对于这种跨版本参数不同导致性能下降的情况有没有好的排查与处理办法? gcc10.3参数 ``` [root@localhost gcc-10.3.0]# gcc -Q -O2 --help=params | grep inline --param=builtin-string-cmp-inline-length=<0,100> 3 --param=inline-heuristics-hint-percent=<100,1000000> 200 --param=inline-min-speedup=<0,100> 30 --param=inline-unit-growth= 40 --param=max-early-inliner-iterations= 1 --param=max-inline-insns-auto= 15 --param=max-inline-insns-recursive-auto= 450 --param=max-inline-insns-recursive= 450 --param=max-inline-insns-single= 70 --param=max-inline-insns-size= 0 --param=max-inline-insns-small= 0 --param=max-inline-recursive-depth-auto= 8 --param=max-inline-recursive-depth= 8 --param=min-inline-recursive-probability= 10 --param=uninlined-function-insns=<0,1000000> 2 --param=uninlined-function-time=<0,1000000> 0 --param=uninlined-thunk-insns=<0,1000000> 2 --param=uninlined-thunk-time=<0,1000000> 2 ``` gcc7.3参数 ``` [root@localhost ~]# gcc -Q -O2 --help=params | grep inline inline-min-speedup default 8 minimum 0 maximum 0 max-inline-insns-single default 400 minimum 0 maximum 0 max-inline-insns-auto default 40 minimum 0 maximum 0 max-inline-insns-recursive default 450 minimum 0 maximum 0 max-inline-insns-recursive-auto default 450 minimum 0 maximum 0 max-inline-recursive-depth default 8 minimum 0 maximum 0 max-inline-recursive-depth-auto default 8 minimum 0 maximum 0 min-inline-recursive-probability default 10 minimum 0 maximum 0 max-early-inliner-iterations default 1 minimum 0 maximum 0 inline-unit-growth default 20 minimum 0 maximum 0 ``` 二、编译一样的代码,不考虑内联,二者有性能差异,gcc10.3编译的性能要更差。 ``` gcc main.c -g -o main_gcc10.3 -O2 -msse4.2 -mavx2 -fno-inline ``` main.c 内容如下 ``` #include <stdio.h> #include <stdint.h> #include <immintrin.h> void rte_mov128blocks(uint8_t *dst, const uint8_t *src, size_t n) { __m256i ymm0, ymm1, ymm2, ymm3; while (n >= 128) { ymm0 = _mm256_loadu_si256((const __m256i *)(const void *) ((const uint8_t *)src + 0 * 32)); n -= 128; ymm1 = _mm256_loadu_si256((const __m256i *)(const void *) ((const uint8_t *)src + 1 * 32)); ymm2 = _mm256_loadu_si256((const __m256i *)(const void *) ((const uint8_t *)src + 2 * 32)); ymm3 = _mm256_loadu_si256((const __m256i *)(const void *) ((const uint8_t *)src + 3 * 32)); src = (const uint8_t *)src + 128; _mm256_storeu_si256((__m256i *)(void *) ((uint8_t *)dst + 0 * 32), ymm0); _mm256_storeu_si256((__m256i *)(void *) ((uint8_t *)dst + 1 * 32), ymm1); _mm256_storeu_si256((__m256i *)(void *) ((uint8_t *)dst + 2 * 32), ymm2); _mm256_storeu_si256((__m256i *)(void *) ((uint8_t *)dst + 3 * 32), ymm3); dst = (uint8_t *)dst + 128; } } uint8_t a[1ULL * 1024 * 1024 *1024]; uint8_t b[1ULL * 1024 * 1024 *1024]; int main(int argc, char **argv) { int i = 0; int n; if (argc != 2) { printf("input run times as parameter.\n"); return -1; } n = atoi(argv[1]); printf("start to run %d.\n", n); while (i++ < n) { rte_mov128blocks(a, b, sizeof(a)); } printf("end to run %d.\n", n); return 0; } ``` 结果 ``` [root@localhost ~]# time ./main_gcc7.3 2000 start to run 2000. end to run 2000. real 6m30.461s user 6m26.587s sys 0m0.814s [root@localhost ~]# time ./main_gcc10.3 2000 start to run 2000. end to run 2000. real 7m18.696s user 7m13.912s sys 0m1.098s ```
版本切换时遇到两个影响性能的问题: 一、两个gcc版本的默认参数 max-inline-insns-single 不一样, gcc7.3是 400 , gcc10.3 只有70, 触发限制导致了inline失败。inline失败编译的二进制会导致性能下降。 有两个问题希望得到解答: 1、开源为什么会有max-inline-insns-single参数变更? 2、社区对于这种跨版本参数不同导致性能下降的情况有没有好的排查与处理办法? gcc10.3参数 ``` [root@localhost gcc-10.3.0]# gcc -Q -O2 --help=params | grep inline --param=builtin-string-cmp-inline-length=<0,100> 3 --param=inline-heuristics-hint-percent=<100,1000000> 200 --param=inline-min-speedup=<0,100> 30 --param=inline-unit-growth= 40 --param=max-early-inliner-iterations= 1 --param=max-inline-insns-auto= 15 --param=max-inline-insns-recursive-auto= 450 --param=max-inline-insns-recursive= 450 --param=max-inline-insns-single= 70 --param=max-inline-insns-size= 0 --param=max-inline-insns-small= 0 --param=max-inline-recursive-depth-auto= 8 --param=max-inline-recursive-depth= 8 --param=min-inline-recursive-probability= 10 --param=uninlined-function-insns=<0,1000000> 2 --param=uninlined-function-time=<0,1000000> 0 --param=uninlined-thunk-insns=<0,1000000> 2 --param=uninlined-thunk-time=<0,1000000> 2 ``` gcc7.3参数 ``` [root@localhost ~]# gcc -Q -O2 --help=params | grep inline inline-min-speedup default 8 minimum 0 maximum 0 max-inline-insns-single default 400 minimum 0 maximum 0 max-inline-insns-auto default 40 minimum 0 maximum 0 max-inline-insns-recursive default 450 minimum 0 maximum 0 max-inline-insns-recursive-auto default 450 minimum 0 maximum 0 max-inline-recursive-depth default 8 minimum 0 maximum 0 max-inline-recursive-depth-auto default 8 minimum 0 maximum 0 min-inline-recursive-probability default 10 minimum 0 maximum 0 max-early-inliner-iterations default 1 minimum 0 maximum 0 inline-unit-growth default 20 minimum 0 maximum 0 ``` 二、编译一样的代码,不考虑内联,二者有性能差异,gcc10.3编译的性能要更差。 ``` gcc main.c -g -o main_gcc10.3 -O2 -msse4.2 -mavx2 -fno-inline ``` main.c 内容如下 ``` #include <stdio.h> #include <stdint.h> #include <immintrin.h> void rte_mov128blocks(uint8_t *dst, const uint8_t *src, size_t n) { __m256i ymm0, ymm1, ymm2, ymm3; while (n >= 128) { ymm0 = _mm256_loadu_si256((const __m256i *)(const void *) ((const uint8_t *)src + 0 * 32)); n -= 128; ymm1 = _mm256_loadu_si256((const __m256i *)(const void *) ((const uint8_t *)src + 1 * 32)); ymm2 = _mm256_loadu_si256((const __m256i *)(const void *) ((const uint8_t *)src + 2 * 32)); ymm3 = _mm256_loadu_si256((const __m256i *)(const void *) ((const uint8_t *)src + 3 * 32)); src = (const uint8_t *)src + 128; _mm256_storeu_si256((__m256i *)(void *) ((uint8_t *)dst + 0 * 32), ymm0); _mm256_storeu_si256((__m256i *)(void *) ((uint8_t *)dst + 1 * 32), ymm1); _mm256_storeu_si256((__m256i *)(void *) ((uint8_t *)dst + 2 * 32), ymm2); _mm256_storeu_si256((__m256i *)(void *) ((uint8_t *)dst + 3 * 32), ymm3); dst = (uint8_t *)dst + 128; } } uint8_t a[1ULL * 1024 * 1024 *1024]; uint8_t b[1ULL * 1024 * 1024 *1024]; int main(int argc, char **argv) { int i = 0; int n; if (argc != 2) { printf("input run times as parameter.\n"); return -1; } n = atoi(argv[1]); printf("start to run %d.\n", n); while (i++ < n) { rte_mov128blocks(a, b, sizeof(a)); } printf("end to run %d.\n", n); return 0; } ``` 结果 ``` [root@localhost ~]# time ./main_gcc7.3 2000 start to run 2000. end to run 2000. real 6m30.461s user 6m26.587s sys 0m0.814s [root@localhost ~]# time ./main_gcc10.3 2000 start to run 2000. end to run 2000. real 7m18.696s user 7m13.912s sys 0m1.098s ```
评论 (
3
)
登录
后才可以发表评论
状态
已完成
待办的
进行中
已完成
已拒绝
负责人
未设置
标签
sig/Compiler
未设置
项目
未立项任务
未立项任务
里程碑
openEuler-22.03-LTS-Dailybuild
未关联里程碑
Pull Requests
未关联
未关联
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
未关联
分支 (34)
标签 (33)
master
sync-pr665-sync-pr664-openEuler-24.03-LTS-SP2-to-master-to-openEuler-25.09
openEuler-24.03-LTS-Next
openEuler-24.03-LTS-SP2
openEuler-24.03-LTS-SP1
openEuler-25.09
openEuler-25.03
openEuler-22.03-LTS-SP3
openEuler-22.03-LTS-SP4
openEuler-20.03-LTS-SP4
openEuler-24.03-LTS
openEuler-24.09
openEuler-22.03-LTS-SP1
openEuler-22.03-LTS-Next
openEuler-22.03-LTS
openEuler-22.03-LTS-SP2
openEuler-20.03-LTS-SP1
openEuler-20.03-LTS-SP3
openEuler-23.09
upgrade-gcc-12
openEuler-23.03
openEuler-22.03-LTS-LoongArch
openEuler-22.09
openEuler-22.03-LTS-performance
openEuler-20.03-LTS-SP2
openEuler-21.09
openEuler-20.03-LTS-Next
openEuler-20.03-LTS
openEuler-21.03-performance
openEuler-20.09
openEuler-21.03
openEuler-20.03-LTS-performance
openEuler1.0
openEuler1.0-base
openEuler-24.03-LTS-SP2-update-20250912
openEuler-22.03-LTS-SP4-update-20250829
openEuler-24.03-LTS-SP2-update-20250725
openEuler-24.03-LTS-SP2-update-20250718
openEuler-24.03-LTS-SP2-release
openEuler-25.03-release
openEuler-20.03-LTS-SP4-update-20250221
openEuler-24.03-LTS-update-20250117
openEuler-24.03-LTS-SP1-release
openEuler-22.03-LTS-SP4-update-20241220
openEuler-22.03-LTS-SP4-update-before-20241025
openEuler-24.03-LTS-update-20241101
openEuler-22.03-LTS-SP4-release
openEuler-24.09-release
openEuler-24.03-LTS-release
openEuler-22.03-LTS-SP3-release
openEuler-23.09-rc5
openEuler-22.03-LTS-Next-release-20221230
openEuler-22.03-LTS-SP1-release
openEuler-22.09-release
openEuler-22.09-rc5
openEuler-22.09-20220829
openEuler-22.03-LTS-20220331
openEuler-22.03-LTS-round5
openEuler-22.03-LTS-round3
openEuler-22.03-LTS-round2
openEuler-22.03-LTS-round1
openEuler-20.03-LTS-SP3-release
openEuler-20.03-LTS-SP2-20210624
openEuler-21.03-20210330
openEuler-20.09-20200929
openEuler-20.03-LTS-20200606
openEuler-20.03-LTS-tag
开始日期   -   截止日期
-
置顶选项
不置顶
置顶等级:高
置顶等级:中
置顶等级:低
优先级
不指定
严重
主要
次要
不重要
预计工期
(小时)
参与者(1)
1
https://gitee.com/src-openeuler/gcc.git
git@gitee.com:src-openeuler/gcc.git
src-openeuler
gcc
gcc
点此查找更多帮助
搜索帮助
Git 命令在线学习
如何在 Gitee 导入 GitHub 仓库
Git 仓库基础操作
企业版和社区版功能对比
SSH 公钥设置
如何处理代码冲突
仓库体积过大,如何减小?
如何找回被删除的仓库数据
Gitee 产品配额说明
GitHub仓库快速导入Gitee及同步更新
什么是 Release(发行版)
将 PHP 项目自动发布到 packagist.org
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册