• [技术干货] 【转载】鲲鹏编译时间优化(C/C++)
    1 问题背景项目中遇到鲲鹏芯片架构下编译C/C++代码编译时间过长,增加了业务版本CI时间,需要优化。本案例分享一下基于cmake和GCC编译优化的思路和措施。2 原因分析获取环境以后,利用开源软件A编译测试,逐步对可能影响编译时间的因素排查调优分析。1.  充分发挥多CPU并行处理功能Make阶段利用多线程处理,将进程个数设置成cpu的核数,提高编译速度。效果:相对于单线程编译来说,有几倍提升。2.  降低iowait同过iostat观察,编译过程中有部分时间出现iowait,特别是编译写文件的时候。方法:修改缓存VM参数,增加缓冲:以下参数和X86配置不一致,修改一致为:(1)/proc/sys/vm/dirty_ratio 修改前10,修改后20效果: 整体编译时间减少2s左右,说明有一定的效果,还不是关键因素。3.  去掉nohz=off/proc/cmdline如果存在nohz=off配置,会对系统性能有影响,尝试去掉测试性能方法:找到系统中/boot/efi/EFI/XXX/grub.cfg的nohz=off去掉,并重启服务器效果:去掉nohz=off参数后测试性能和修改前差不多4.  Gcc参数加入ARM相关编译参数新版本gcc里面加入了对ARM架构的编译优化参数,如-mtune=tsv110,-march=armv8-a,尝试是否对编译性能有提升。方法:升级编译gcc到9.2.0版本,在编译脚本gcc后面加上-mtune=tsv110,-march=armv8-a参数,重新对程序进行编译测试性能。效果:添加参数后gcc编译性能无提升,平均执行时间和修改前差不多。此选项加入是优化编译软件运行性能的,不会降低编译时间。5.  内存页大小通过perf分析,编译代码有很多跳转指令,汇编代码中加载内存指令的执行时间段很高,分析可能是内存主要瓶颈。Perf热点函数分析内存换页函数调用频繁,浪费时间。可以通过扩大内存页来加大每页命中率,减少页切换的资源浪费。方法:获取内核源码,修改.config文件参数CONFIG_ARM64_64K_PAGES=y(注意,执行make menuconfig通过界面修改更为全面),重新编译内核,然后系统用新内核启动。检查是否修改成功: getconf PAGESIZE  显示为65536 即表示修改成功。效果:编译时间缩短20%左右,优化效果较大。3 解决方案综上分析,通过并发编译、修改vm缓存参数和调整内存页大小为64K对编译时间优化有显著效果。修改方法也在上文有描述。4 总结优化编译时间在版本构建的时候很关键,能节约不少构建时间,提高生产效率。目前大多是对编译出程序性能的优化,这样必然会增加编译时间,比如说如果用高版本的GCC编译器,编译出来的程序性能会更好,但是编译时间可能变长了,相比低版本的GCC来说。也就是说,如果想优化编译时间,尽量避免去用新GCC版本,或者利用新的GCC编译优化参数。 提供程序运行性能,让他跑得更快,还是老一套,去分析程序运行时的系统瓶颈,解除瓶颈后会对性能有提升,如本案例中内存就是一个瓶颈。转自:https://bbs.huaweicloud.com/forum/thread-42510-1-1.html
  • [大赛专区] 关于口罩大作战赛道一(C++)的记录和总结——White-Loub
        2020.5.6    20:38    四月末看到学校的通知,加上女朋友的大力“怂恿”,作为一个刚刚入门的小白,我毅然决然的和女朋友一起报名参加了比赛,后面的过程真是一把鼻涕一把泪。我想把我的思路和参赛经历记录下来,也就当做纪念啦。当然啦,由于学识疏浅,我的代码里并没有什么特别厉害的算法,如果能给各位提供一点点一点点参考,那真是。。。很很很很有幸了(注:本人排名30+,和我排名相近的同学和排名在前的大佬们怕是没有什么可以参考的了),献丑啦!        我使用的是C++语言,代码整体思路非常简单。    首先我思考了一下配送口罩的整个过程,其实就是1.快递员取口罩;2.快递员思考目的地;3.快递员送口罩。在代码实现的过程中,思路可以稍微修改一些,比如快递员取口罩和送口罩其实都包含了快递员的移动和口罩数量的变化,为了更好实现,在代码中我们就可以将这两部分分开,所以上面的几点其实可以转换为下面几个模块:1.快递员朝目标地移动;2.快递员携带的口罩数量和建筑物口罩数量变化;3.判断快递员的目标地。其实我认为这道题最难的地方就在于快递员目标地的判断,这部分的算法就导致了快递员的送货效率(完成一幅地图的步数),很显然,作为小白,我不知道该如何更好的处理这一部分,算法真是又难又厉害呀。    明确了刚才的思路,我们就可以开始写具体的代码啦,以下记录的代码主要是样例,具体代码由于比赛还未结束,会在结束后更新!    当然,我们首先先完成地图的录入工作,也就是记录仓库和需求小区的位置(题目开始的6个输入)!/*例如,这是仓库的录入代码*/ char S;//定义仓库名称  int S_x,S_y;//定义仓库变量;我没有使用数组来记录各个建筑物的值,而是使用了整数变量,便于理解 cin>>S; if(S =='S') { cin>>S_x>>S_y; //输入仓库坐标信息 }    然后,就开始代码的主体,就是按照刚才的思路来,在这里,为了获取一个G的输入我们就进行一次移动或者判断,我使用了While循环!第一步的移动可以靠预设的值进行,以后的移动靠上一轮循环判断的目标进行移动,同时,用一个变量(我用的是send_or)判断移动是配送移动还是取货移动可能更容易梳理逻辑,另外不要忘记捐赠小区的输入!char G;//获取系统输入指令 int send_or=1;//设定送货还是取货状态,0为取货,1为送货  int P_x,P_y,P_send;//设定快递员位置和快递员口罩数量  int O_send=0;//设定快递员到的补给点,初始补给点设为仓库(假设仓库编号为0) .............;//部分变量设置未展示 cin>>G; //首先是先获取第一个G的输入,然后开始循环 while(G) {     /*如果新输入为R开头的捐赠小区,则记录离目标点近的补给小区*/       if(G=='R')     {         int i;         cin>>R_donation_x[donation_j]>>R_donation_y[donation_j]>>R_donation_num[donation_j];//我使用数组记录捐赠的小区,比较复杂,不要忘记捐赠小区的录入就好         for(i=1;i<donation_j;i++)         {             if(R_donation_x[donation_j]==R_donation_x&&R_donation_y[donation_j]==R_donation_y)             {                 R_donation_num=R_donation_num+R_donation_num[donation_j];                 R_donation_x[donation_j]=0;                 R_donation_y[donation_j]=0;                 R_donation_num[donation_j]=0;                 donation_j=donation_j-1;                 break;              }         }         donation_j++;     }      /*进入移动阶段*/     /*例如判断是否向仓库移动*/     if(G=='G' && send_or==0 && O_send==0)     { if((S_x-P_x)<0)//判断是否需要向北走  { cout<<'N'<<endl; P_x--; } else if((S_x-P_x)>0)//判断是否需要向南走  { cout<<'S'<<endl; P_x++; } else if((S_y-P_y)>0)//判断是否需要向东走  { cout<<'E'<<endl; P_y++; } else if((S_y-P_y)<0)//判断是否需要向西走  { cout<<'W'<<endl; P_y--;      }     }          /*判断是否向捐赠小区移动*/      .........................//部分代码未展示          /*判断是否向目标小区移动*/     .........................//部分代码未展示 }    然后,是对快递员到达各个位置数量变化的判断,依旧在While循环内,这里要注意两个问题:1.捐赠小区生成在快递员的当前位置;2.移动途中经过了需求小区!while(G) {     ....................//刚才的代码          /*以下进入判断阶段*/     /*如果经过或者踩到仓库的处理方法,只判定数量改变*/     if(P_x==S_x&&P_y==S_y)     {         P_send=100;     }          /*如果经过或者到达捐赠小区,包括捐赠小区生成在快递员位置,只判定数量改变*/     i_pro=1;     for(i_pro=1;i_pro<donation_j;i_pro++)     {          if(P_x==R_donation_x[i_pro]&&P_y==R_donation_y[i_pro])         {             if(P_send+R_donation_num[i_pro]<=100)              {                 P_send=P_send+R_donation_num[i_pro];                 R_donation_num[i_pro]=0;             }             else             {                 R_donation_num[i_pro]=R_donation_num[i_pro]+P_send-100;                 P_send=100;             }                  break;//如果已经确认踩到,就跳出循环          }     }          /*如果经过或者到达需求小区的处理方法,只判定数量改变*/     .....................................//部分代码未展示 }    最后,就是对目标地的判断,主要是判断快递员的目标,再次循环时,快递员再根据目标进行移动、判断数量、判断目标,不断循环!最后部分因为我代码的变量太复杂,展示后不太容易看懂,我就详细的记录和总结一下我的思路,和刚才的例子形成一个整体。刚才我们已经说了,对于目标地点的判断是核心,再此之前,我们要完成需求小区、捐赠小区信息录入,要有数组或者专门的变量进行记录,这样我们可以确定每个建筑;然后是移动,第一步的移动可以靠预设的值进行,以后的移动靠上一轮循环判断的目标进行移动。    最后的判断部分,我的想法很简单,就是每一步结束以后进行判定:1.如果处在取货状态,快递员到达目标点(仓库或者捐赠小区)后,就改成送货状态;或者未到达目标点,但是身上的货物满足当前需求(当前配送的目标需求小区的需求)也改为送货状态;2.如果处于送货状态,快递员身上的货物由于经过了非目标需求小区导致货物数量不达标,则改为取货状态;3.正处于取货状态,先判断除仓库外口罩数量满足当前需求(当前配送的目标需求小区的需求)的捐赠小区,再选择这些小区中距离最近的一个作为取货的目标,如果一个都没有,就设定仓库为取货的目标。    依次循环,便可跑完地图。    注意,这道题中需要注意的几个点,我记录下来:1.捐赠小区可能生成在快递员位置上,此时快递员会取走该捐赠小区的货物(快递员的携带的货物不会超过100,只会补齐缺少的数量);2.捐赠小区的口罩如果没被取完会一直保留;3.经过需求小区和捐赠小区,快递员的数量一定要进行判定是否发生变化。    总结。最后做个总结!我写这一篇记录真是在各位大佬面前献丑啦,感谢华为和各位参赛同学,真是让我见识到算法的神奇!我更加可以理解好的算法在一段代码中起到的核心作用,而且编程真是逻辑性非常强的事情,有时候逻辑上错一点,代码便会运行出错,而为了让自己的思路通畅,就需要我有良好的编程习惯(比如规范的格式、便于理解的变量命名等),就像那句话说的一样:“I'm not a great programmer; I'm just a good programmer with great habits.”OK!感谢各位!我会继续努力,争取早日搞懂诸如启发式搜索之类的算法,然后在最后的几个小时,我希望再改进一下代码,优化一下快递员取货目标的计算!哈哈哈~    冲鸭!--------------------------------------------------------------------我是分割线!---------------------------------------------------------------------    2020.5.7    21:18    更新一波,分享我和女朋友的代码!班门弄斧,献丑啦!    今天晚上看了各位大佬的解题思路,受益匪浅!我们会继续努力的!    继续冲鸭!
  • [大赛专区] 赛道一小结(C++)_本次竞赛算法思路与代码分享以及学习c++的资源链接和计算机速成课视频链接
             从学校官网得知比赛消息,到现在转眼已经快两周了,比赛也接近了尾声,写一个小结也算记录下这次的比赛经历,毫不夸张的再说,这次比赛我投入了几乎自己全部的精力和热情去做这件事,中断了坚持了一个月的健身,刚刚恢复的作息再一次变得乱七八糟,但是看到提交成功也有一种小小的成就感,第一眼看到竞赛标题,“口罩配送”,就觉得新奇和接地气,自己参加比赛之余也觉得自己是在为改善社会生活做了一丁点贡献。       这是我最终成绩的截图,以及有幸登入一次每日PK榜,和前面的大神有好远的距离,看了大神们的分享,发现还是思路有了很大的局限性。       下面说说我的编程之旅吧,看完题目和要求,我就先衡量自己的选择和需要准备的东西,编程语言我选了c++,并没有什么高大上原因的考虑,因为我只会它,然后就是编程软件和开发环境,我用的是VS2019而没选择devc++,是因为用过前者,但是这个选择也让我后来遇到了一个问题。       搭建好编译环境,我就着手于整个程序框架的搭建,我喜欢整体确定后,慢慢完善的感觉,写完了输入输出函数,就开始着眼于方法的实现,一开始太过于贪心,总想着用些高大上的有技巧的方法,结果一整天也没什么进度,主要还是知识储备量匮乏,高深的算法也理解不了就更谈不上灵活使用。后来我就完全自己去想解决方法,首先是数据的整理以及特征化。我建立了下图中这些结构体数组,其中包含地图每一点的信息如同一幅图像数组,配送员的状态,捐赠小区的状态以及配送小区的状态。       结合之前和导师做过图像滤波方面的东西,我就选择了类似于均值滤波,中值滤波这样的小窗口来收集配送员周边的捐赠和配送小区的信息,从而选择移动的方向,后来由于窗口选择太小对突然出现的捐赠小区不敏感,从而路径优化的程度太低放弃了,窗口再大就不如处理整个12*12矩阵了。不过得益于此,从这之后,我从局部最优联想到当前路径最优。即将在最短步数下完成一个配送次数,配送次数就是指满足一个小区所需要到该小区的次数,需求量大于100的为2,小于100的为1。        具体操作就是:        1,当配送员在仓库时,将配送小区信息按照距离仓库的由近到远排序,选择最近的配送点作为配送目标。        2,当配送员到达配送小区后,根据配送员身上的剩余口罩数目判断接下来的目标点,按照配送小区距离配送员的近到远查询配送小区的需求数进行查询,当目前地图未出现捐赠点时,如果配送员自身剩余口罩不满足一个配送次数,则将目标点为仓库。        3,当目前地图出现捐赠点时,配送员自身剩余口罩加上全部捐赠数目满足一个配送次数,则启动最短路径查询函数,以目前所在点到仓库加上距离仓库最近点的配送小区所需要的步数为衡量标准,计算满足一个配送次数所走的最短路径,并将该路径沿途的捐赠点坐标信息以及目标点坐标信息进行保存,每经过一个捐赠点就会将下一步的坐标作为行进目标。       4,当所有配送小区需求数目为0,退出程序。        其中,最短路径查询函数的原理是分别以剩余四个配送点作为路径终点,采用递归方式,进行将捐赠点任意组合形成路径,比如1,2,3三个捐赠点,就会有1,2,3,12,13,123等六条路径,同时对需要经过多捐献点的路径将捐赠点按照走完所需要最短步数的原则进行排序,结合配送员和捐赠点的口罩数将不符合配送次数的路径剔除。       具体代码我分享到附件当中,有兴趣的可以看看。       下图是代码函数中的子函数以及相关注释:       在这个最终版想法之前,我是用路径最优法,选择比原路径降低步数最多的路径进行存储,再将去往每个配送点的路径进行同样比较,选择降低步数最多的路径作为当前的路径。后来经过测试发现当前路径最优法会造成多余步数,就是比如配送员还差一步到达目标,此时出现一个捐赠点,程序判定配送员经过该捐赠点到达另一个目标比当前的路径优化的步数多,它就会毅然去往捐赠点,导致未完成目标,之前走的路就有点多余。为解决这个问题,我就将追求当前路径最优改成了当前路径最短,与路径最优选择方法一致,只不过是选择一条步数总和最少的路,完成程序编写之后就开始了我漫长又难熬的调试过程,用一句话简单却又痛苦的话就是,我走了一些弯路。       线下测试和程序debug的成功和一上传就说我编译错误,让我一度抓狂,后来被群里的一个小伙伴建议用devc++试试,我就用它编译了一下,出了很多警告和一个错误,我才知道vs2019可能会默认一些新编译规则,我改正了警告,修复了错误。然而故事并没有结束,我遇到了群里很多小朋友遇到的问题“配送已结束,仍有小区未获得口罩”,我本着一定是数据或我程序判定部分出问题的观念,不停地debug,验证数据的传递和每一个判断,却什么也没发现,我想是我设想的地图情况太少的原因,就边百度边修改了线下测试程序,改成随机生成地图,测试100幅,报了错误,我将报错的地图一幅幅的分析,都没找到程序哪儿的命令出错了,我仔细看了看测试代码,发现错误原因是两者的信息不一致,后来又是群里一个小伙伴点醒了我,测试程序只能接受方向指令,无法进行多余的操作,即我程序原本设定的是到了配送小区有选择的留下口罩数目,但是测试程序直接扣除了配送员身上的全部,导致两者信息的不一致。Bug找到进行了修复,害怕再失败我就在线下测试了1000幅随机地图,都成功了,我就提交了作品,事实证明我还是太年轻了,网页信息提醒我配送员超出了地图范围,这个原因有两种,一种是接受你的移动指令后,位置超出了地图数组边界,另一种就是配送员原地打转。。。。由于没有地图信息无法调试,我就又跑了随机测试程序,事实证明同志们,测试次数再多也不为过!我跑了3000幅地图!!才有一幅爆出了我超出范围的错误!有了地图后面的单步修改程序就简单了很多,在提交成功后,评分第一次出现的时候,真是超级激动有木有!接下来没有程序细节上的问题,我又对程序算法做了一些调整,将路径最优算法和路径最短算法进行结合使用,路径最优算法用于当配送员位于配送点时触发,能保证当前路径最优,在新捐献点出现时触发路径最短算法,就解决了路径最优算法造成的步数浪费。写了这么多,絮絮叨叨,应该也没人会看完,本来打算5.4时候写一下发一下,庆祝下节日,可惜程序的bug没让我如愿。      以上就是我这次竞赛的全部经历和想法历程了,也算是一种自我梳理。最后这几天状态的总结可以用一个成语来形容,废寝忘食,有时候亲身体会了才明白古人诚不欺我,也许对编程是一种热爱吧,只有热爱才会让我专心致志和想要去完成一件事,一直觉得虚拟行业很酷,你编的每一条代码,每一行指令都是在让那个世界越来越美,希望有一天自己参与完成的一些东西在这个世界的角落,稳定而又高效的运行着,它的每一秒都是在让这个世界更美好。,希望大家多多批评指正!多多留言给我!                                                                                                                                                                                             2020/05/05           注:下面的链接是我在学习c+和数据结构时看的一些视频链接,网上反响比较好的,希望大家一起学习!大家一起进步!          【C语言】《带你学C带你飞》(小甲鱼):https://www.bilibili.com/video/BV17s411N78s?p=1          计算机速成课(很有意思,对于梳理计算机体系很有用):https://www.bilibili.com/video/BV1EW411u7th?p=1          C++从0到1入门编程(附C++编程环境搭建教程):https://www.bilibili.com/video/BV1et411b73Z?p=1          数据结构(郝斌):https://www.bilibili.com/video/BV11s41167h6?p=1
  • [问题求助] 请问ATLAS 200DK中如何使用纯C(不是C++)的代码?
    直接源码编译报ELF重定位.Information:/usr/lib/gcc-cross/aarch64-linux-gnu/5/../../../../aarch64-linux-gnu/bin/ld: CMakeFiles/picasso.dir/core/encrypt/aes.c.o:普通ELF重定位(M: 62)Information:/usr/lib/gcc-cross/aarch64-linux-gnu/5/../../../../aarch64-linux-gnu/bin/ld: CMakeFiles/picasso.dir/core/encrypt/aes.c.o:普通ELF重定位(M: 62)Information:CMakeFiles/picasso.dir/core/encrypt/aes.c.o: 无法添加符号: 文件格式错误Error:collect2: error: ld returned 1 exit status编成.a,如下图所示:
  • 【speccpu】speccpu2006连跑报错libstdc++.so.6 cannot open shared object
    1      软硬件配置 类别子项版本 硬件CPU鲲鹏920网络1822网卡存储SATA 4T内存--OSCentOS7.6Kernel4.14.0-115.el7a.0.1.aarch64软件Speccpu2006gcc7.3.02      组网配置不涉及                                     3      问题3.1      问题描述:编译升级gcc到7.3.0后连跑speccpu2006报错libstdc++.so.6: cannot open shared object file: No such file or directory3.2      问题分析:我们编译的gcc7.3.0的lib64下是有libstdc++.so.6的库的,但是speccpu却打印不存在,可能是环境变量设置问题我们在/etc/profile中添加如下内容(LD_LIBRARY_PATH环境变量主要用于指定查找共享库(动态链接库)时除了默认路径之外的其他路径。(该路径在默认路径之前查找))export LD_LIBRARY_PATH=/usr/local/gcc-7.3.0/lib64:$LD_LIBRARY_PATHsource /etc/profile然后重新执行测试可以成功3.3      问题结论:编译的gcc7.3.0下的动态库speccpu2006无法找到,需要通过LD_LIBRARY_PATH环境变量添加gcc7.3.0下的动态库路径,在/etc/profile中添加export LD_LIBRARY_PATH=/usr/local/gcc-7.3.0/lib64:$LD_LIBRARY_PATH解决
  • [问题求助] 在modelarts如何使用caffe的c++接口进行训练
    请问如何方便的在modelarts如何使用caffe的c++接口进行训练
  • [技术干货] 鲲鹏开发套件 Porting Advisor — 华为鲲鹏代码迁移工具:帮助厂商识别迁移中的部分问题
    运行平台:X86;TaiShan 100;TaiShan 200运行操作系统:CentOS;RedHat;中标麒麟等。详细的平台和操作系统对应关系请参见用户指南。软件发布时间:2020.3.13版本号:2.1.1软件介绍华为鲲鹏代码迁移工具是一款可以简化客户应用迁移到TaiShan 100/200服务器或鲲鹏云服务(KC1、鲲鹏裸机)的过程的工具。对于源码移植扫描中心,当客户有X86平台上源代码的软件要移植到TaiShan 100/200服务器或鲲鹏云服务(KC1、鲲鹏裸机)上时,可用该工具的源码移植扫描中心自动分析出需修改的代码内容,并指导用户如何修改。源码移植扫描中心解决了用户代码兼容性人工排查困难、移植经验欠缺、反复依赖编译调试定位等痛点。支持的功能特性如下:检查用户C/C++软件构建工程文件,并指导用户如何移植该文件。检查用户C/C++软件构建工程文件使用的链接库,并提供可移植性信息。检查用户C/C++软件源码,并指导用户如何移植源文件。检查用户软件中X86汇编代码,并指导用户如何移植。支持命令行方式和Web两种工作模式。软件移植中心,提供基于华为TaiShan解决方案的软件移植模板,您可以选择模板对应的软件进行自动化移植修改、编译、构建软件包。软件分析构建中心,通过分析软件构成关系及硬件依赖性,提供x86平台软件包在鲲鹏平台的重构能力。用户指南    华为鲲鹏代码迁移工具用户指南问题反馈    工具使用中遇到问题请在鲲鹏论坛跟帖回复:鲲鹏论坛软件下载    Kunpeng软件包下载:立即下载    数字签名    X86软件包下载:立即下载    数字签名    白名单下载:跳转到下载链接https://www.huaweicloud.com/kunpeng/software/portingadvisor.html
  • [迁移工具] 【DevRun Live】如何实现从x86到鲲鹏平台90%C/C++代码自动迁移 (华为 张汝涛)
    如何实现从x86到鲲鹏平台90%C/C++代码自动迁移(华为 张汝涛)直播简介:C语言自诞生以来,被广泛用与开发各行各业的软件。C++语言既保留了C语言有效性、灵活性等特点,又增加了面对对象编程的支持,具有强大的编程功能。C/C++语言多年来移植是程序喜爱的编程语言之一。C/C++是编译型语言,硬件平台的切换将导致原有C/C++程序不能运行,开发者不得不解决软件移植问题。软件移植是个“脏活”,需要开发者修改源码、编译、再修改、再编译,费时费力。 直播亮点:怎样才能帮助开发者在鲲鹏平台上快速移植C/C++软件并完成编译呢?怎样才能帮助开发者在鲲鹏平台上快速运行C/C++程序呢?怎样才能帮助开发者快速定位软件的性能瓶颈并优化呢?怎样才能实现90%C/C++代码快速迁移到鲲鹏平台呢? 预习材料:https://bbs.huaweicloud.com/forum/thread-34057-1-1.html,华为鲲鹏开发套件提高C/C++软件迁移效率,实现90%C/C++代码自动迁移到鲲鹏平台。回放链接:https://hdcwebinars.huaweicloud.com/watch/rm2kr1xm 专家简介:华为智能计算部门主任工程师,华为鲲鹏开发套件的设计者。从事软件开发20年,聚焦于开源软件开发、移植和性能优化,完善Arm64软件生态。
  • [问题求助] presenterserver有没有C/C++版的?
    我们要把Atlas200要作为从机,处理完图片或者视频后,要将结果返回给主机。目前例子中给出的都是python版本的presentserver,有没有c/c++版本的presentserver? 或者其它的C/C++的解决方案?谢谢。
  • [C/C++] 鲲鹏C/C++编译时间优化技术案例分享
    1 问题背景项目中遇到鲲鹏芯片架构下编译C/C++代码编译时间过长,增加了业务版本CI时间,需要优化。本案例分享一下基于cmake和GCC编译优化的思路和措施。2 原因分析获取环境以后,利用开源软件A编译测试,逐步对可能影响编译时间的因素排查调优分析。1.  充分发挥多CPU并行处理功能Make阶段利用多线程处理,将进程个数设置成cpu的核数,提高编译速度。效果:相对于单线程编译来说,有几倍提升。2.  降低iowait同过iostat观察,编译过程中有部分时间出现iowait,特别是编译写文件的时候。方法:修改缓存VM参数,增加缓冲:以下参数和X86配置不一致,修改一致为:(1)/proc/sys/vm/dirty_ratio 修改前10,修改后20效果: 整体编译时间减少2s左右,说明有一定的效果,还不是关键因素。3.  去掉nohz=off/proc/cmdline如果存在nohz=off配置,会对系统性能有影响,尝试去掉测试性能方法:找到系统中/boot/efi/EFI/XXX/grub.cfg的nohz=off去掉,并重启服务器效果:去掉nohz=off参数后测试性能和修改前差不多4.  Gcc参数加入ARM相关编译参数新版本gcc里面加入了对ARM架构的编译优化参数,如-mtune=tsv110,-march=armv8-a,尝试是否对编译性能有提升。方法:升级编译gcc到9.2.0版本,在编译脚本gcc后面加上-mtune=tsv110,-march=armv8-a参数,重新对程序进行编译测试性能。效果:添加参数后gcc编译性能无提升,平均执行时间和修改前差不多。此选项加入是优化编译软件运行性能的,不会降低编译时间。5.  内存页大小通过perf分析,编译代码有很多跳转指令,汇编代码中加载内存指令的执行时间段很高,分析可能是内存主要瓶颈。Perf热点函数分析内存换页函数调用频繁,浪费时间。可以通过扩大内存页来加大每页命中率,减少页切换的资源浪费。方法:获取内核源码,修改.config文件参数CONFIG_ARM64_64K_PAGES=y(注意,执行make menuconfig通过界面修改更为全面),重新编译内核,然后系统用新内核启动。检查是否修改成功: getconf PAGESIZE  显示为65536 即表示修改成功。效果:编译时间缩短20%左右,优化效果较大。3 解决方案综上分析,通过并发编译、修改vm缓存参数和调整内存页大小为64K对编译时间优化有显著效果。修改方法也在上文有描述。4 总结优化编译时间在版本构建的时候很关键,能节约不少构建时间,提高生产效率。目前大多是对编译出程序性能的优化,这样必然会增加编译时间,比如说如果用高版本的GCC编译器,编译出来的程序性能会更好,但是编译时间可能变长了,相比低版本的GCC来说。也就是说,如果想优化编译时间,尽量避免去用新GCC版本,或者利用新的GCC编译优化参数。 提供程序运行性能,让他跑得更快,还是老一套,去分析程序运行时的系统瓶颈,解除瓶颈后会对性能有提升,如本案例中内存就是一个瓶颈。
  • [中间件] 【华为云鲲鹏云服务最佳实践】【工具篇】第137期boost-1.69.0安装配置指南
    1、简介Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称。2、基础环境类别子项版本获取地址(方法)华为云虚拟机KC1(920)--OSCentOS7.6Kernel4.14软件包 boost1.69.0https://kojipkgs.fedoraproject.org//packages/boost/1.69.0/13.fc32/src/boost-1.69.0-13.fc32.src.rpm3、依赖安装yum install -y mock gperftools-devel libpcap-devel libstemmer-devel openssl-devel pcre-devel python3-scons snappy-devel yaml-cpp-devel zlib-devel valgrind-devel libcurl-devel python3-devel 4、组件编译安装 下载并解压组件wget https://kojipkgs.fedoraproject.org//packages/boost/1.69.0/13.fc32/src/boost-1.69.0-13.fc32.src.rpm#boost-devel安装编译rpm -ivh boost-1.69.0-13.fc32.src.rpm#编译rpmbuild -ba /root/rpmbuild/SPECS/boost.spec   安装依赖yum install -y gcc-c++ bzip2-devel python3-numpy libicu-devel openmpi-devel mpich-devel   修改boost.spec中关于python3-numpy的部分,python3-numpy编译出来的就是python36-numpyyum install –y python36-numpy修改boost.spec中关于gcc-c++的部分,去掉gcc-gcc安装部署参考:《华为云鲲鹏云服务最佳实践-gcc-7.3.0安装部署指导》https://bbs.huaweicloud.com/forum/thread-39010-1-1.html5、系统配置无6、测试无7、参考信息无8、FAQ8.1问题:boost编译报错./boost/python/detail/wrap_python.hpp:50:11: fatal error: pyconfig.h: No such file or directory 解决方法:yum install -y python-devel8.2问题:boost编译报错ERROR: No build ID note found in /root/rpmbuild/BUILDROOT/boost-1.69.0-13.el7.aarch64/usr/bin/quickbook 解决方法::是在spec文件中任意位置添加如下参数:%define __debug_install_post %{_rpmconfigdir}/find-debuginfo.sh %{?_find_debuginfo_opts} "%{_builddir}/%{?buildsubdir}" %{nil}8.3问题:boost编译报错error: File not found: /root/rpmbuild/BUILDROOT/boost-1.69.0-13.el7.aarch64/usr/lib64/libboost_stacktrace_addr2line.so.1.69.0解决方法:注释掉spec文件中%{_libdir}/libboost_stacktrace_addr2line.so.%{sonamever} 8.4问题:boost编译报错证书未生成解决方法:将开始报错的所有证书都注释 8.5问题:boost编译报错error: Installed (but unpackaged) file(s) found: 解决方法:找到/usr/lib/rpm/macros 文件中%__check_files         %{_rpmconfigdir}/check-files %{buildroot} 注释掉
  • [中间件] 【华为云鲲鹏云服务最佳实践】【工具篇】第136期Boost-1.55.0安装配置指南
    1、简介Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称。2、基础环境类别子项版本获取地址(方法)华为云虚拟机KC1(920)--OSCentOS7.6Kernel4.14软件包boost1.55.0 https://kent.dl.sourceforge.net/project/boost/boost/1.55.0/boost_1_55_0.tar.gz 3、依赖安装无4、组件编译安装下载安装包(指定路径)cd /opt/wget -c https://kent.dl.sourceforge.net/project/boost/boost/1.55.0/boost_1_55_0.tar.gz --no-check-certificatetar -xzvf boost_1_55_0.tar.gz./bootstrap.sh --with-libraries=system,filesystem,log,thread --with-toolset=gcc./b2 toolset=gcc cxxflags="-std=c++11" ./b2 install   运行./b2 install 命令,默认安装在/usr/local/lib目录下头文件在/usr/local/include/boost目录下install 后面可以加参数--prefix=path 5、系统配置无6、测试无7、参考信息无8、FAQ无
  • [问题求助] 请问notebook是否支持基于C++、调用python库的程序?
    我们有一套深度学习程序,是基于C++的,然后在程序中调用python库。请问这样的程序能部署到ModelArts中吗?我在ModelArts新建notebook时没看到有C++的工作环境,只有python2 和python3的,请问应该怎么设置?谢谢
  • [问题求助] 关于C++ 接口能否实现不定义graph.config 直接加载模型后使用opencv做resize然后推理
    请问大家如果我想用c++的接口,去实现pythonclassification这个例子一样只加载模型,然后用opencv做resize操作后送进模型里,不定义对应graph.config,这种操作可以实现吗?还是必须要定义graph,控制数据的流向?
  • [课程内容] C++实践教学精品课标准
    C++实践教学精品课标准课程地址课程概述:本课程适合作为高等学校计算机专业及相关专业C++语言程序设计课程的教材,可供从事计算机软件开发人员参考使用。本课程主要介绍了C++语言编程相关知识,重点介绍C++语言概述、函数、类与对象、数据共享与保护、数组、指针、字符串、继承、派生、多态、群体类和群体数据的组织、泛型、C++标准模板库、流类库、输入输出及异常处理。 通过本课程,学生能够学习并了解C++语言语法,体会和领悟面向对象程序设计方法和泛型程序设计方法的优势,结合课程中的编程练习题,能够进一步加深学生动手能力,提升学生对C++知识的掌握和实际应用。材料数作业数习题数五星推荐搭配1591288《C++习题库》含376道习题 作者介绍华为云教育,本课程由华为云教育内容开发团队开发完成,团队主要负责教育解决方案内容开发和建设。包括但不限于课件、视频、习题、代码、案例项目、实训课等。  课程定位:本课程根据人才培养目标,制定涵盖低级,中级,高级等多级分类的知识点、原理、定理等课程体系,满足人才培养需求,包括知识要求、能力要求、素质要求。C++语言为C语言的进阶,学习它是很有必要的,做人工智能的研究,想要深入底层,TensorFlow的核心是用C++写的;做游戏开发,包括端游和网游后台,以发挥计算机的全部性能,需要C++;做智能硬件、嵌入式或硬件驱动开发,C++会提供更多工具,生产效率更高。 岗位及从业方向:岗位:游戏开发工程师、服务器开发工程师、应用开发工程师、C++逆向开发工程师、嵌入式开发工程师、图像处理工程师。从业方向:服务器端开发、游戏开发、虚拟现实仿真、数字图像处理、网络安全、黑客攻防、破解等方向。 前/后导课程:C++语言程序设计可以说是C语言程序设计的进阶课程,学好《计算机应用基础》、《C语言程序设计》,会让你学习起来简单得多。《计算机应用基础》——>《C语言程序设计》——>《C++程序设计》、《Java程序设计》、《数据结构》 本课程的主要任务是:1.    掌握面向对象程序设计的各种概念、机制及其用法2.    掌握C++泛型程序设计,熟练编写各类模板3.    熟练使用C++的标准模板库4.     初步具备用C++语言和面向对象的方法开发大型程序的能力5.    通过学习本课程,让学习本课程的人有一个扎实的计算机基础,对计算机架构,操作系统,编程语言,计算机网络有一个本质的认识,做到以不变应万变,并且可以独立开发模仿一些常用的软件工具和网站以及安卓程序,解决日常生活中遇到的各种计算机问题。6.    考核达标后,基本达到入职企业所需具备的软件开发职业素质。7.    培养学生严肃,认真一丝不苟的工作作风。培养学生积极思考,通过算法编程题,锻炼思维能力,培养创新能力。8.    为以后深入其他任何计算机领域奠定坚实的根基,未来才能够走的更远,站的更高,解决一般程序员无法解决的问题,成为优秀的人才。 本课程知识教学目标:1.了解计算机程序设计语言的基本知识。2.掌握基本类型、表达式、数据的输入输出、算法的基本控制结构及枚举类型。3.掌握函数的定义、调用、参数传递、函数种类和使用。4.掌握类和对象的使用、构造函数、析构函数、UML类图、结构体、联合体。5.掌握数据共享、数据保护、多文件结构,了解编译预处理命令。6.掌握指针、数组的定义和使用。7.掌握类的继承与派生、派生类的构造定义和析构函数的使用。8.了解并掌握多态性的概述、运算符重载、虚函数和抽象类的使用。9.掌握函数模板与类模板的定义和使用及排序方法的分类使用。10.掌握泛型程序设计与C++标准模板库。11.了解流的概念及流类库结构、掌握输入输出流。12.   理解异常处理的思想,掌握C++异常处理的实现。       教学大纲:第1章绪论1)     计算机程序设计的发展2)     面向对象的方法3)     面向对象的软件开发4)     信息的表示和存储5)     程序的开发过程通过本章节的学习,学生可以:1)     了解 计算机程序设计语言的发展、计算机语言的分类2)     掌握信息的分类、几种进位计数制的转换3)     理解源码、反码、补码的定义及使用4)     掌握定点数、浮点数、数的表示范围及非数值信息的表示5)     了解程序开发的过程 第2章C++简单程序设计1)     C++语言概述2)     基本数据类型和表达式3)     数据的输入与输出4)     算法的基本控制结构5)     枚举类型通过本章节的学习,学生可以:1) 了解 C++ 语言发展和应用2) 掌握 C++能够处理的基本数据类型和表达式3) 了解IO流、简单IO格式控制。4) 理解并掌握算法的基本控制结构及使用方法,包括if、switch、while、do-while、for、break、continue、goto语句5) 掌握枚举类型的定义和使用 第3章函数1)     函数的定义与使用2)     内联函数3)     带默认参数值的函数4)     函数重载5)     使用C++系统函数通过本章节的学习,学生可以:1)     学会函数的定义及使用2)     理解函数调用的形式、掌握嵌套调用和递归调用3)     掌握函数参数传递的定义及使用方法4)     理解并掌握内联函数的使用、注意事项及内联函数的应用5)     掌握带默认参数值的函数的使用6)     学会函数重载如何使用及注意事项7)     了解C++系统函数8)     学会将一段功能相对独立的程序写成一个函数第4章类与对象1)     面向对象程序设计的基本特点2)     类和对象3)     构造函数和析构函数4)     类的组合5)     UML图形标识6)     结构体7)     联合体通过本章节的学习,学生可以:1)     了解面向对象的基本概念2)     掌握类和对象的声明使用3)     掌握构造函数及析构函数定义和使用4)     理解类的组合、会使用向前引用声明5)     了解UML类图6)     掌握结构体的定义和初始化7)     学会联合体的声明、内存分配及使用方法 第5章数据的共享与保护1)     标识符的作用域与可见性2)     对象的生存期3)     类的静态成员4)     类的友元5)     共享数据的保护6)     多文件结构和编译预处理命令通过本部分的学习,使学生:1)     熟练掌握函数原型的作用域、局部作用域、类作用域、文件作用域2)     理解可用性的概念3)     了解什么是动态生存期和静态生存期,掌握变量的生存期与可见性4)     掌握静态数据成员的声明和使用5)     理解友元的定义,学会友元函数的使用6)     了解数据的共享、保护7)     掌握C++程序的一般组织结构8)     理解外部函数和外部变量的定义及使用方法9)     掌握标准C++库10)  学会编译预处理命令的使用 第6章数组、指针与字符串1)     数组2)     指针3)     动态内存分配4)     用vector创建数组对象5)     深拷贝与浅拷贝6)     字符串通过本部分的学习,使学生:1)     熟练掌握一维数组、二维数组、对象数组的概念、声明与使用2)     了解内存空间的访问方式3)     掌握指针的赋值及运算4)     理解动态内存分配及动态的使用5)     学会用Vector创建数组对象6)     理解深拷贝和浅拷贝的定义和使用7)     掌握用字符数组处理字符串的方法8)     熟练使用String类 第7章继承与派生1)     类的继承与派生2)     访问控制3)     类型兼容规则4)     派生类的构造、析构函数5)     派生类成员的标识与访问通过本部分的学习,使学生:1)     理解类的继承关系,学会使用继承关系实现代码的重用2)     了解继承与派生的概念、目的3)     理解派生类的声明及生成过程4)     掌握公有继承、私有继承、保护继承的定义及使用方法5)     了解类型转换的规则6)     掌握继承时及单一继承时构造函数的使用7)     了解作用域限定8)     掌握虚基类的引入、声明和作用9)     熟练掌握虚基类及其派生类构造函数的使用 第8章多态性1)     多态性概述2)     运算符重载3)     虚函数4)     抽象类通过本部分的学习,使学生:1)     理解多态的概念,学会运用多态机制2)     掌握多态的概念、类型及实现3)     学会重载“+”“-”运算符的使用4)     理解运算符重载的规则5)     掌握运算符重载为成员函数6)     掌握运算符重载为非成员函数7)     了解并掌握虚函数的概念和声明8)     了解为什么使用虚析构函数和使用方法9)     掌握纯虚函数的定义和使用10)  了解抽象类的作用和使用 第9章群体类和群体数据的组织1)     函数模板2)     类模板3)     线性群体4)     群体数据的组织通过本部分的学习,使学生:1)     理解函数模板的概念和定义方法2)     了解并掌握类模板的作用和声明以及使用3)     理解线性群体的概念4)     掌握动态数组类模板的使用5)     熟练掌握链表的基本操作:生成结点、**结点、查找结点、删除结点、遍历链表、清空链表6)     了解栈的概念,掌握栈的基本状态:栈空、栈满、一般状态7)     掌握什么是队列及队列的基本状态:队空、队满、一般状态8)     掌握循环队列的定义和使用 第10章泛型程序设计&C++标准模板库1)     泛型程序设计及STL的结构2)     迭代器3)     容器的基本功能与分类4)     顺序容器5)     关联容器6)     函数对象7)     算法通过本部分的学习,使学生:1)     了解泛型程序设计的基本概念2)     了解STL概念及组成3)     理解迭代器的分类、迭代器的区间4)     了解并掌握迭代器的辅助函数的使用5)     掌握输入流迭代器、输出流迭代器的使用6)     理解容器的基本功能和分类7)     了解顺序容器的接口和基本操作8)     了解三种顺序容器的特性9)     掌握顺序容器**迭代器的方法10)  学会以顺序容器为基础构建一些常用数据结构11)  了解优先级队列定义及使用12)  掌握关联容器分类和的基本功能13)  掌握函数对象的定义和使用14)  了解STL算法概念和分类15)  学会使用不可变序列算法、可变序列算法、排序和搜索算法、数值算法 第11章流类库与输入输出1)     IO流的概念及流类库结构2)     输出流3)     输入流4)     输入/输出流通过本部分的学习,使学生:1)     了解IO流的概念及流类库结构2)     掌握输出流的分类及如何构造输出流对象3)     学会**运算符和操纵符的使用4)     掌握文件输出流成员函数的三种类型及使用5)     理解二进制输出文件6)     掌握字符串输出流的功能和应用7)     了解输入流的分类8)     掌握输入流对象的构造方法9)     学会使用提取运算符10)  理解输入流相关函数的使用方法11)  掌握字符串输入流功能和应用12)  理解并掌握输入/输出流两个重要的类 第12章异常处理1)     异常处理的基本思想2)     C++异常处理的实现3)     异常处理中的构造与析构4)     标准程序库异常处理通过本部分的学习,使学生:1) 了解异常处理的基本思想2) 掌握异常处理的语法和异常接口声明3) 了解异常处理中的构造与析构4) 了解标准程序库异常处理方法5) 学会标准程序库的异常类的使用课时建议:序号课 程 内 容学  时  数合计理论教学实践教学实训教学教学实习1绪论222C++简单程序设计4223函数6424类与对象151235数据的共享与保护6426数组、指针与字符串6427继承与派生6428多态性5419群体类和群体数据的组织4410泛型程序设计&C++标准模板库54111流类库与输入输出2212异常处理321总计644816 教学过程与方法目标:建议在进行该课程的教学过程中,充分利用classroom平台的在线判题和授课能力,在讲完每个章节之后,通过在C++语言习题库中,根据该章节的知识点选择客观题(选择、判断、填空)等,进行选题出题,进行上课期间的随堂作业,在3~5分钟内,学生需要完成作业并提交,老师通过平台反馈的数据,及时了解学生对该章节知识点的掌握情况,对大部分学生都答错了的习题所对应的知识点,需要重点再讲解。 另外,可以通过C++语言习题库,根据知识点选择适量的在线编程题,作为作业下发给学生进行课后编程练习,通过学生提交的代码以及完成功能的正确率,对相关知识点进行重点讲解,通过课后编程题练习,也可以有效的提升学生的动手编程能力,这样就达到了不仅仅能掌握理论知识,还能动手将理论和实际相结合,提升学生的动手能力。在教学到第5章左右,可以结合classroom平台,给学生布置一些相对复杂的C++语言单人工程型习题,培养学生项目开发的能力,以及团队合作精神。 考核要求:(1)考核包括,期末考核70%,平时30%(2)理论考核采用闭卷形式,时间100分钟(3)题型为填空、选择、程序设计(4)考试内容分配:基础60%,综合40%(5)试卷难度分配:基本内容60%,适中内容30%,难度内容10%(6)技能考核方式是上机操作,主要考核程序改错和编程,通过classroom平台完成作业的提交,在线编程等。 参考文献:《C++语言程序设计》(第4版)郑莉 清华大学出版社   
总条数:310 到第
上滑加载中