gcc_for_openeuler鲲鹏亲和优化案例.md

发布时间:2026/7/29 1:20:55

gcc_for_openeuler鲲鹏亲和优化案例.md 鲲鹏亲和优化## 使用数组加宽比较优化(array-widen-compare)步骤 1 准备用例 test.c#includestdint.h#includestdio.h#includesys/time.h#defineLEN1024000#definemy_min(x,y)((x)(y)?(x):(y))// 优化主体函数 (优化选项 -farray-widen-compare)uint32_tfunc(uint32_tlen0,uint32_tlen1,constuint32_tlen_limit,constuint8_t*constpb,constuint8_t*constcur){uint32_tlenmy_min(len0,len1);while(len!len_limit)if(pb[len]!cur[len])break;returnlen;}intmain(){uint8_tpb[LEN]{0};uint8_tcur[LEN]{0};// 前期数据准备for(inti0;iLEN-1;i){pb[i]i*23;}pb[LEN-1]5;for(inti0;iLEN-1;i){cur[i]i*23;}cur[LEN-1]6;uint32_tres0;structtimevalstart,end;longtime;gettimeofday(start,NULL);// 主要循环for(inti0;i2000;i){resfunc(0,0,LEN-1,pb,cur);}gettimeofday(end,NULL);// 计算循环执行时间time(end.tv_sec-start.tv_sec)*1000000(end.tv_usec-start.tv_usec);printf(\nRunning Time%ld us\n,time);printf(res%d\n,res);return0;}步骤 2 对test.c进行原生编译$ gcc-O3test.c-otest_before步骤 3 对test.c 进行添加选项编译$ gcc-O3-farray-widen-compare-otest_after步骤 4 执行test_before$ ./test_before Running Time:2744325usres1023999步骤 5 执行test_ after$ ./test_after Running Time:425955usres1023999步骤 6 查看优化效果从结果上看编译增加array-widen-compare选项之后运行时间缩减约80%同时最终结果保持一致表明该优化选项在此类场景下能够取得显著提升。## 使用ccmp指令流水优化步骤 1 准备用例test.cintfunc(inta,intb,intc){while(1){if(a--0||bc){return1;}}}步骤 2 对test.c原生编译为汇编代码$ gcc-O-Stest.c-obase.s步骤 3 查看汇编代码$vimbase.s核心函数部分为func: .LFB0: .cfi_startproc .L2: cmp w1, w2 cset w3, ge cmp w0, 0 cset w4, eq orr w3, w3, w4 sub w0, w0, #1 cbz w3, .L2 mov w0, 1 ret .cfi_endproc .LFE0:步骤 4 使用ccmp指令优化编译$ gcc-O-fccmp2-Stest.c-otest.s步骤 5 查看优化后的汇编代码$vimtest.s核心部分为func: .LFB0: .cfi_startproc b .L2 .L3: mov w0, w3 .L2: sub w3, w0, #1 cmp w0, 0 ccmp w1, w2, 0, ne blt .L3 mov w0, 1 ret .cfi_endproc .LFE0::经过优化之后在arm64平台上能够使能ccmp指令。SPECCPU2017子项557提升约1%。

相关新闻