现在的位置: 首页 > 综合 > 正文

使用Intel编译器(5)PGO(6)PGO工具之profmerge&proforder

2013年04月23日 ⁄ 综合 ⁄ 共 3665字 ⁄ 字号 评论关闭
参考手册:

http://software.intel.com/sites/products/documentation/studio/composer/en-us/2011Update/compiler_c/index.htm

说明:本系列文章为个人笔记,如有不正确之处,请参考官方相关文档,如果错误发现,我会尽量更新修改。另外,以下内容不保证对于所有版本的编译器都正确,编译器的实现也可能有一些变化之处,具体参考官方文档。

更多说明请参考http://blog.csdn.net/gengshenghong/article/details/7034748中补充说明部分。

Summary:前面是代码覆盖工具,这里介绍的是两个辅助性的小工具,profmerge和proforder,它们主要是辅助其他工具使用(前面的代码覆盖已经提到了profmerge工具)。

(1) 回顾PGO相关选项和文件输出

先再次回顾一下PGO的选项和相关的输出文件:

1. PGO三步曲:

使用/Qprof-gen选项编译:其输出为辅助性可执行文件,在可执行文件中插入了相关的代码。

运行辅助可执行程序:运行过程中,产生dyn动态信息文件(dynamic profile information),每次运行,都可能产生一些dyn文件,dyn文件可以有多个。

使用/Qprof-use选项编译:编译得到优化后的可执行文件。其编译前编译器会首先将所有dyn文件合并为一个dpi文件。说明:这里要介绍的profmerge也可以完成将多个dyn合并为一个dpi文件,且使用起来更灵活,不需要使用/Qprof-use编译就可以进行合并。

2. /Qprof-gen:srcpos:

前面的代码覆盖工具使用的就是这个选项,当然这个选项后面的工具还会用到。使用这个选项取代PGO优化中的第一步的选项,那么除了得到辅助可执行文件,还会生成两个文件:PGOPTI.SPI,PGOPTI.SPL,其中SPI表示static profile information,和dpi对应,保存静态信息。注意:这两个文件只有在使用/Qprof-gen:srcpos的时候才会产生,前面的代码覆盖工具codecov使用了spi和dpi文件,后面的工具也会用到。

总结:这里简单回顾了PGO选项相关的输出:spi、dpi、dyn、辅助可执行文件等。

(2) profmerge合并工具

1. 功能

profmerge工具用于将多个dyn文件合并到一个dpi文件,编译器在反馈编译阶段(即使用/Qprof-use)会自动先使用profmerge进行合并。其可以将当前目录或者指定目录下的所有dyn文件合并到一个dpi文件。

说明:由于profmerge会合并所有的dyn文件到dpi文件,所以使用的时候,记得要删除目录下无关的dyn文件,一个例子是:在代码覆盖的时候,如果已经运行过辅助可执行文件,进行过代码覆盖测试,如果还是继续在当前目录下运行辅助可执行文件,然后进行代码覆盖测试,一定要先将之前生成的dyn文件都删除,否则得到的结果不正确。

2. 选项:

profmerge的功能很简单,所以其选项也很容易理解了,都是一些基本的选项。

-help:显示帮助信息

-nologo:运行时不显示版本信息。

-dump:显示dump信息,使用此选项后,profmerge合并的同时会输出一些相关信息,这些信息就是dyn(dpi)文件中保存的信息。

-prof_dir dir:设置要合并的dyn文件所在目录和生成的dpi文件的所在目录。

-prof_dpi file:设置生成的dpi文件的文件名,如:profmerge -prof-dpi test.dpi

-prof_file file:?????????????

(3) proforder工具

1. 功能:

proforder工具也是在PGO编译的反馈编译阶段(/Qprof-use)被使用的,用于提高性能。proforder工具用于生成/ORDER链接选项需要的一个函数列表。关于/ORDER选项,参考MSDN文档:http://msdn.microsoft.com/zh-cn/library/00kh39zz(v=VS.80).aspx。简单理解,/ORDER指定一个文件,表示要链接的obj文件的函数的顺序列表。很显然,同样的函数,同样的代码,不同的链接顺序得到的性能也会不一样(比如指令cache的对齐等问题)。

2. 使用:

proforder需要指定spi和dpi文件,要得到spi文件,需要使用/Qprof-gen:srcpos选项编译,dpi就可以利用profmerge得到了。其输出为一个proford.txt(默认)的文本文件,内容为函数列表。

说明:proforder需要使用到spi和dpi文件,输出是一个txt文件。从PGO的三步编译来看,并没有生成SPI文件和txt文件,那么是不是说PGO编译过程中没有使用proforder呢?相信PGO一定会用到/ORDER链接来控制函数列表的链接顺序,之所以没有看到有spi和txt文件,可能是作为临时文件删除了,或者直接在内存中完成了相关的内容。当然,这并不是一个大问题。问题是proforder单独使用好像意义并不大,当然,或许对于将编译和链接分开进行的时候,可能有用吧。

3. 选项:

-help:显示帮助信息

-nologo:不显示版本信息

下面是一个简单的例子来理解部分的选项:

// File: profmerge_proforder.cpp
#include <stdio.h>

void foo()
{
	printf("foo\n");
}

static void bar()
{
	printf("bar\n");
}

void foobar()
{
	printf("foobar\n");
}

int main()
{
	foo();
	bar();
	foobar();
	
	return 0;
}

@echo OFF
rem #File: clear_build.bat
rem #set proforderopts=-nologo ...	rem #can set env vars in command line or in this file before run this bat file.

rem #clear
if exist *.obj del *.obj
if exist *.exe del *.exe
if exist *.dyn del *.dyn
if exist *.lock del *.lock
if exist *.dpi del *.dpi
if exist *.spi del *.spi
if exist *.spl del *.spl

rem #compile
icl profmerge_proforder.cpp /Qprof-gen:srcpos

rem #run
profmerge_proforder

rem #profmerge
profmerge

rem #cls
cls

rem #proforder
proforder %proforderopts%

(运行上面的bat之前使用“set proforderopts=”设置proforder的选项即可)

下面是不使用其它选项的时候输出的proford.txt文件的内容:

main
?foo@@YAXXZ
printf
?bar@@YAXXZ # STATIC: 'C:\TEMPLAB\PGO\PROFMERGE&PROFORDER\PROFMERGE_PROFORDER.CPP'
?foobar@@YAXXZ

-omit_static选项:函数顺序中忽略静态函数(不显示静态函数)。从上面的txt中看到bar函数的现实后面有STATIC的信息,使用下面的命令运行:

set proforderopts=-nologo -omit_static

clear_build.bat

后,得到的proford.txt的内容如下:

main
?foo@@YAXXZ
printf
?foobar@@YAXXZ

很容易看到,没有显示static函数。

指定输入输出的选项:

-prof_dir dir:指定查找输入的spi和dpi文件所在的目录,默认为当前目录。
-prof_dpi file:指定输入的dpi文件的文件名,默认为pgopti.dpi.
-prof_file string:这个选项表示,spi文件为string.spi,dpi文件为string.dpi(string替换为指定的任意字符串)。测试发现,使用了这个选项后,-o选项等选项没有效果,输出文件为string.ipo(是ipo后缀...),当然,其内容还是一个文本文件。说明:使用这个选项,那么spi和dpi文件的文件名就是一样的了,只能是string.dpi和string.spi,输出也只能是string.ipo了。
-prof_spi file:指定输入的spi文件的文件名,默认为pgopti.spi.
-o file:指定输出的txt文件的文件名,默认为proford.txt.

这就是proforder的所有选项了,可见proforder使用还是很容易的。

【上篇】
【下篇】

抱歉!评论已关闭.