使用Intel编译器(5)PGO(3)评测函数或循环执行时间(Profile Function or Loop Execution Time)

来源:互联网 发布:09淘宝店 编辑:程序博客网 时间:2024/04/25 09:47

(1) Profile Function or Loop Execution Time

Intel编译器的除了使用profile进行PGO优化之外,也提供了对程序的函数或循环执行时间进行profile的功能。之所以把这一功能和PGO优化放在一个部分,是因为它们有一些相同之处:都是通过编译器在编译时给生成的可执行文件中插入辅助代码(测试代码,instrumentation code),对于PGO,这些辅助代码会在运行的时候产生dyn文件以供编译器优化使用,对于这里的执行时间的测试,这些辅助代码的作用就是用于收集代码中不同位置的时间消耗数据,这些数据就能帮助我们标识代码的热点(hotspots),从而对特定部分进行优化。

注意:如果使用过VTune等性能分析工具,就对热点这些概念很熟悉了。那么这里的功能是编译器的功能,而VTune是不要求必须使用Intel编译器的,它们的作用有些类似,但是实现方式不同,编译器的这个功能是通过在可执行文件中插入了辅助代码,而VTune是通过采样来收集数据的。


(2) 函数或循环执行时间评测的级别

根据插入的辅助代码的不同,编译器对profile execution time分为三个级别:

•function level函数级别
•function and loop level函数和循环级别
•loop body level循环体级别

很显然,三个级别收集的数据是不断深入的。


(4) Profile Execution time的使用和输出

要使用此功能,只需要在编译的时候使用相应的选项告诉编译器进行什么级别的测试,编译器就会生成一个辅助的可执行文件,执行可执行文件会输出相应的信息。需要注意的是:

1. 此功能只能用于单线程程序的测试。这是由于其工作的原理是插入辅助代码,读取CPU的时间戳,对于多线程代码,是无法得到一个正确的时间的。一般而言,对于热点分析,单线程分析的结果就足矣了,如果需要分析多线程的相关性能问题,比如等待和锁,可以借助VTune工具。所以,使用此功能的时候,要关闭相应的可能生成多线程代码的优化选项,比如自动并行化选项等。

2. 辅助程序的输出是通过atexit()函数注册的程序完成的,只会在程序通过标准的突出流程退出时才会产生。其输出包括两种格式:

文本格式,使用tab分隔,所以可以使用文本编辑器或者excel查看;

xml格式,可以使用数据查看器查看(下面会给出例子)。


(3) 相关选项和数据查看

1. 不同级别的选项:

/Qprofile-functions,只在函数入口和出口插入辅助代码,输出文件在当前目录下的loop_prof_funcs_<timestamp>.dump中。

/Qprofile-loops:<arg>,在函数和循环的入口和出口插入辅助代码,其中arg可以为inner、outer、all,分别表示要测试的循环类型为内层循环、外层循环或所有循环。输出的文件在当前目录下的loop_prof_funcs_<timestamp>.dump和loop_prof_loops_<timestamp>.dump中。

注意:是编译器可能无法测试部分循环。另外,测试是在许多编译优化的转换发生之后,所以有些循环被重新组织或复制,导致生成的报告可能会有多个入口。另外,函数也可能被内联到其它函数,所以,同一个循环也可能被列举在多个函数中。

/Qprofile-loops-report:[n],控制循环体的测试级别,其中n=1是不指定n的默认情况,表示收集循环的入口和出口的cycle counts;n=2表示插入额外的辅助代码,收集循环迭代数来计算循环的最小、最大、平均迭代的cycle counts。

注意:和上面的循环测试一样,测试时在许多编译优化的转换发生之后,所以其计数是根据生成的循环的形式(比如使用SSE指令循环迭代数可能减少)。此选项只有在使用了/Qprofile-loops的情况下才有效,它是用于修饰/Qprofile-loops选项的。


2. 实例和输出数据查看

要查看数据,最好的方式就是来一个实际的例子了,如下:

待更新。。。

原创粉丝点击