分享个有关矢量化编程的Guide
-
无论是GCC还是Intel compiler 无论C/C++还是Fortran,在涉及到高性能计算的时候难免会遇到性能表现低于预期的情况。在刨除硬件原因,程序的编写也是个值得注意的地方。
矢量化是将算法从一次对单个值进行操作转换为一次对一组值进行操作的过程。现代 CPU 直接支持向量运算,其中单个指令应用于多个数据 (SIMD)。
https://www.intel.com/content/www/us/en/developer/articles/technical/vectorization-a-key-tool-to-improve-performance-on-modern-cpus.html矢量化这里指的并不是说将变量转换为array 或者向量,矩阵。这里指的是编译的时候,基于AVX512/SSE等CPU指令集的优化。
下面是Intel 官方提供的 A Guide to Vectorization with Intel C++ Compilers.
https://www.intel.com/content/dam/develop/external/us/en/documents/31848-compilerautovectorizationguide.pdf在我使用OpenFOAM的经历中,OF的编译都是直接使用wmake然后系统会自动编译,从来没有考虑过什么Compiler flag,有没有矢量化等等。
因此,有的时候user-define的model往往成为高性能计算的bottleneck。希望有空的时候,有些同学可以研究一下,提高计算效率~同时在b占看到用人用inteladvisor记性程序性能分析测试,推荐一波,没仔细看,但是感觉挺有用。
https://www.bilibili.com/video/BV1bg411S7kY/?vd_source=9b9f509ff457caa06206ec8f5560c371