Intel Tools Training Notes Intel Compiler, MKLs

Intel Tools Training Notes

1. Intel Compiler general switches. 常用的命令option有:

0d: Disable optimizations.
Zi: Creates Symbols.
O1: Optimizes without increasing code size.
O2: Default optimization switch.
O3: Agressive optimization switches. 有时用O3会导致程序出错,无法编译等情况,有时用O3确实能提高速度,有时反而会降低速度,所以谨慎使用。

2. 高级的编译器编译option,这里介绍几个,有点意思:

Inter-Procedural Optimization: -ip, -ipo, enable inter-procedural optimizations for single/multiple files. 这个选项是这个意思:他能优化一些函数调用和if语句,比如一个函数非常短,就是做一些简单运算然后就return了,那么用这个option之后,编译 器会把这个函数直接变成类似inline的代码,这样就省掉了函数调用时的入栈,出栈的开销,对于一些短小的if/else的语句,编译器也会自动优化, 有时会把一些永远执行不到的if语句的从句去掉,消除死代码。

Inter-Procedural Optimization: -prof_gen, -prof_use,Use execution-time feedback to guide optimization, Aids paging, branch-prediction, basic block reordering. 这个选项也有点意思,特别对if语句优化,CPU在执行if语句的时候,对于汇编来说,if就是jump类指令,那么CPU现在在执行这样的指令的时候, 在执行if的同时,会同时预取if后面的指令(或else部分的指令,不同的CPU行为不一样),装载入流水线以提高效率,但是如果if语句判断下来要执 行的代码不是CPU预取的那部分指令(比如CPU预取的是if部分的代码,但是实际情况需要跳转到else部分),那么CPU就要把已经装载的指令卸下 来,然后重新装载正确的指令,这是需要不少指令周期的。这个option是这样用的,首先用prof_gen编译生成一个可执行文件,然后反复执行这个可 执行文件,在执行的过程中,程序就会生成profile文件,该文件中记录了if和else部分各自被执行的次数,如果执行多遍后发现假设100次执行 中,if被执行了99次,else只执行了1次,那么,就可以用prof_use这个选项重新编译程序(要附带程序生成的那个profile文件),此时 编译器就会根据profile中的信息优化程序结构,让CPU预取经常被执行的那部分指令,这样就大大提高了流水线装载指令的正确性,提高了效率(有点类 似提高CPU cache的hit rate)。

Auto-Parallelization: -parallel,这个选项编译器会试图自动将他能识别的能并行的代码并行,不过由于编译器能识别的能自动并行的要求太苛刻,所以这个选项效果并不好,基本上不能自动并行大部分代码,所以建议不要使用了。

OpenMP support: -openmp 即可。

3. Intel IPP/MKL. IPP和MKL基本上差不多,IPP能干的事情MKL基本上都能干,MKL能干的IPP基本上也都能干,这是由于历史原因造成的。不过现在IPP主要针对 的是Multimedia, Data Processing and Embedded applications. 而MKL主要针对的是HPC Area。有个提醒就是,当处理小数据量的时候,不要用IPP或MKL,这样反而会降低性能,因为IPP和MKL都会起很多线程来处理数据,如果数据量 小,性能反而下降。IPP和MKL相比,MKL能处理相对更大的数据量,所以用在HPC方向。最后给一张IPP和MKL在FFT方面的功能比较表,看出来 还是MKL功能全一些:
原文地址:https://www.cnblogs.com/super119/p/2017813.html