今日已完成任务列表
4-4、DarkNet 程序性能优化
遇到的问题和解决方案
无
任务完成详细笔记
首先拷贝 darknet 到自己的文件夹下,解压并进入文件夹之后,修改 Makefile 文件 (加上-pg选项)
执行 make 指令进行编译
注意:每次对源码进行修改之后都要重新 make,加上 -pg 选项只是为了之后方便了解程序运行的详情,方便优化,但这本身会产生一定的开销,最终版需要去掉。
在 make 指令执行完之后使用如下指令进行执行:
yhrun -p thcp1 -N 1 -n 1 ./darknet detect cfg/yolov3-tiny.cfg yolov3-tiny.weights data/kite.jpg
对生成的 gmon.out 文件进行转换 (二进制转为普通文本文件)
gprof darknet gmon.out>output.txt
可以将 output.txt 文件下载到本机或者使用 cat output.txt 直接查看等:
可以发现 gemm_nn 函数的执行耗时占了 94.75%,这也是之后需要重点优化的对象
没有采用任何优化的情况下程序执行结果如下:
进入到 darknet-master 的 src 文件夹下,执行如下指令查看函数 gemm_nn 在哪些文件出现:
grep -r gemm_nn
进入到 gemm.c 文件,并找到 gemm_nn 函数:
对此处的三重循环进行优化:循环交换、循环不变量外提、循环展开
当然了,肯定还是有很多其他的优化手段的,本人能力有限呀~发动小脑筋吧 (≧∇≦)ノ
进行上述优化后重新编译执行:
这里是加 -pg 选项下运行的结果,实际上要是比这个耗时更少的
之后重复上述步骤,再次得到 output.txt 查看各个函数的执行情况:
可以发现除了 gemm_nn 函数,im2col_cpu 处于执行消耗的第二名,之后考虑对其进行优化
同样的方法,找到该函数所在的文件:
同样是三重循环,这里我主要使用了循环不变量外提的方法:
进行上述优化后重新编译执行:
这个是 去掉 -pg 选项的执行情况,个人认为提升不是很大就没有再继续了,想要优化到极致的可以反复上述过程,不断寻找耗时长的函数对其使用尽可能多的优化手段!
对自己的表现是否满意
通过对 darknet 项目进行优化,了解了传统程序优化的基本流程,并对之前所学的内容有了很好的检验,个人认为学习阶段最终结果并不重要,重要的是掌握项目优化的思路和所用的工具。看到所学内容能为程序运行带来如此大的性能提升,还是很满意的 (✿◡‿◡)
简述下次计划
复盘整个学习过程并总结。
其他反馈
无