一.Xilinx Zynq-7000带来新的设计思路
在以前,我们的单板上往往有CPU和多片FPGA,由CPU完成系统的配置和管理,FPGA完成特定算法的
Xilinx推出的Zynq-7000系列芯片很好的解决了这一问题。它内含硬化好的CPU核和常见的外设
在这一流程中,重要的一环是如何找出软件中对性能影响最大的那部分代码。对于简单的应用,我们可以很容易的
二.Profiling的对象
在Linux下有很多profiling工具,各自有自己的优势和劣势。在这里我们重点研究一下如何使用g
很多介绍profiling工具的文章都是开发者自己写一个简单源文件,里面有简单的函数调用。
为了更好的展示profiling的效果,这里我们没有采用这种方法,而是采用了一个相对比较复杂的软件包
libjpeg 是一个完全用C语言编写的库,包含了被广泛使用的JPEG解码、JPEG编码和其他的JPEG功能的实现。
cjpeg和djpeg:用于JPEG的压缩和解压缩,可以和一些其他格式的图形文件进行转换。
rdjpgcom和wrjpgcom:用于在JFIF文件中插入和提取文字信息。
jpegtran:一个用于在不同的JPEG格式之间进行无损转换的工具。
在这里cjpeg和djpeg就是很不错的profiling对象,有一定的复杂度,但又没有复杂到令人生
Libjpeg可以在http://www.ijg.org/ 上找到。这里使用的版本是13-Jan-2013发布的release 9。下载后的源文件是jpegsrc.v9.tar.gz
三. GNU profiler(gprof)简介
GNU profiler(gprof)是GNU Binutils(https://sourceware.org/binutils/ )的一个组成部分,详细的文档可以在https://sourceware.org/binutils/docs/gprof/ 找到,默认情况下Linux系统当中都带有这个工具,不过如果打算在嵌入式开发板上用还是需要对GNU Binutils做交叉编译的。
Gprof的功能:
1. 生成“flat profile”,包括每个函数的调用次数,每个函数消耗的处理器时间,
2. 生成“Call graph”,包括函数的调用关系,每个函数调用花费了多少时间。
3. 生成“注释的源代码”,即是程序源代码的一个复本,标记有程序中每行代码的执行次数。
Gprof的原理:
通过在编译和链接时使用 -pg选项,gcc 在应用程序的每个函数中都加入了一个名为mcount (也可能是”_mcount”或者”__mcount”, 依赖于编译器或操作系统)的函数,这样应用程序里的每一个函数都会调用mcount, 而mcount 会在内存中保存一张函数调用图,记录通过函数调用堆栈找到的子函数和父函数的地址,以及所有与函数相关的调
Gprof基本使用流程
1. 在编译和链接时加上-pg选项。一般可以加在 Makefile 中的CFLAGS和LDFLAGS中。
2. 执行编译的二进制程序。执行参数和方式同以前。
3. 正常结束进程。这时内存中的信息会被写入到程序运行目录下的gmon.out 文件中。
4. 用 gprof 工具分析 gmon.out 文件。
Gprof参数说明
Ÿ -b 不再输出统计图表中每个字段的详细描述。
Ÿ -p 只输出函数的调用图(Call graph的那部分信息)。
Ÿ -q 只输出函数的时间消耗列表。
Ÿ -e Name 不输出函数Name 及其子函数的调用图(除非它们有未被限制的其它父函数)。可以给定多个-e 标志。一个 -e 标志只能指定一个函数。
Ÿ -E Name 不输出函数Name 及其子函数的调用图,此标志类似于 -e 标志,但它在总时间和百分比时间的计算中排除了由函数Name 及其子函数所用的时间。
Ÿ -f Name 输出函数Name 及其子函数的调用图。可以指定多个 -f 标志。一个 -f 标志只能指定一个函数。
Ÿ -F Name 输出函数Name 及其子函数的调用图,它类似于 -f 标志,但它在总时间和百分比时间计算中仅使用所打印的例程的时间。可以指定多个 -F 标志。一个 -F 标志只能指定一个函数。-F 标志覆盖 -E 标志。
一般用法:
gprof -b ELF_file_name gmon.out >report.txt
Gprof报告中flat profile表格各列的说明:
%time: 该函数消耗时间占程序所有时间百分比,全部相加应该是100%。
Cumulative seconds: 程序的累积执行时间,包括表格内该函数所在行之上的所有函数的执行时间
Self Seconds: 该函数本身的全部执行时间。表格会依照这列的数值按照降序排序所有行
Calls: 函数被调用次数, 如果无法确定则为空。
Self ms/call: 函数平均执行时间。
Total ms/call: 函数平均执行时间, 包括其内部调用。
Name: 函数名。在按照self seconds和calls排序后再依照这列进行字母排序。
Gprof报告中Call Graph表格各列的说明:
Index: 索引值
%time: 函数消耗时间占所有时间百分比
Self: 函数本身执行时间
Children: 执行子函数所用时间
Called: 被调用次数
Name: 函数名
Gprof的优势:
1. 简单易用。只需要在编译和链接是增加-pg选项。gprof对于代码大部分是用户空间的CPU密集型的应用
2. GNU Binutils的组成部分,基本上任何Linux里面都有。可以把生成的gmon.out拷贝到host
Gprof的劣势:
1. Gprof只够监控到编译和链接时有-pg选项的函数,工作在内核态的函数和没有加-pg编译的第三方库函
2. Gprof不能监控shared library,即.so的文件。
http://www.cnblogs.com/lenolix/archive/2010/12/13/
3. Gprof 不支持多线程应用,多线程下只能采集主线程性能数据。原因是在多线程内只有主线程才能响应gprof采用的
4. gprof只能在程序正常结束退出,或者通过系统调用exit()退出之后才能生成报告(gmon.out
5. 函数执行时间是估计值。函数执行时间是通过采样估算的, 在执行时间足够长的情况下,这个不是什么大的问题,一般估算值与实际值相差不大。
四.Gprof在Zynq-7000开发板上的实验:
Hardware: ZC706 evaluation board(其他开发板亦可,只是细节上会略有不同)
Software: Xilinx 14.7 Linux pre-built
Tool chain: PetaLinux 2013.04 tool chain
为了简单起见,笔者没有重新编译Linux,而是使用的Xilinx 14.7 Linux pre-built。
在Linux Host上下载libjpeg后执行以下命令即可完成编译:
cd <working_dir>
tar zxvf /path/to/jpegsrc.v9.tar.gz
cd jpeg-9
./configure --prefix=/home/wave/xilinx/libjpeg/jpeg-bin --host=arm-xilinx-linux-gnueabi
Note: 参数--prefix指明编译结果的安装位置,参数--host指明交叉编译工具链的前缀。在使用Peta
这里需要编辑Makefile,在CFLAGS和LDFLAGS中增加-pg选项。
make
make install
这时编译完成后的可执行程序cjpeg和djpeg使用到了.so文件,不适合用gprof。关于这一点可
arm-xilinx-linux-gnueabi-gcc -std=gnu99 -g -O2 -pg -o djpeg-s djpeg.c wrppm.c wrgif.c wrtarga.c wrrle.c wrbmp.c rdcolmap.c cdjpeg.c ../jpeg-bin/lib/libjpeg.a
arm-xilinx-linux-gnueabi-gcc -std=gnu99 -g -O2 -pg -o cjpeg-s cjpeg.c rdppm.c rdgif.c rdtarga.c rdrle.c rdbmp.c rdswitch.c cdjpeg.c ../jpeg-bin/lib/libjpeg.a
然后将jpeg-bin下的所有内容打包,和Xilinx 14.7 Linux pre-built image files,以及数据文件park-2880x1800.jpg拷贝到SD卡中,从SD卡启动ZC706开
在开发板的console上,执行以下命令
mount /dev/mmcblk0p1 /mnt
mkdir work
cd work
tar zxvf /mnt/jpeg-bin.tar.gz
cd jpeg-bin/bin
cp /mnt/park-2880x1800.jpg .
export LD_LIBRARY_PATH=/home/root/work/jpeg-bin/lib
time ./djpeg-s -bmp park-2880x1800.jpg > result.bmp
mv gmon.out gmon-ds.out
time ./cjpeg-s ./result.bmp > ./result.jpg
mv gmon.out gmon-cs.out
对于djpeg-s和cjpeg-s,执行时间如下所示。我们可以看到这两个应用程序的主要执行时间实在用
real 0m4.258s
user 0m4.200s
sys 0m0.050s
real 0m4.289s
user 0m4.230s
本视频基于Xilinx公司的Artix-7FPGA器件以及各种丰富的入门和进阶外设,提供了一些典型的工程实例,帮助读者从FPGA基础知识、逻辑设计概念
本课程为“从零开始大战FPGA”系列课程的基础篇。课程通俗易懂、逻辑性强、示例丰富,课程中尤其强调在设计过程中对“时序”和“逻辑”的把控,以及硬件描述语言与硬件电路相对应的“
课程中首先会给大家讲解在企业中一般数字电路从算法到流片这整个过程中会涉及到哪些流程,都分别使用什么工具,以及其中每个流程都分别做了
@2003-2020 中国电子顶级开发网