提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
在高性能计算(HPC)中,优化数值模拟器的性能对于提高计算效率至关重要。OpenCAEPoro作为一个专为多孔介质设计的数值模拟器,其性能优化不仅可以减少计算时间,还可以提高资源利用率。本文将探讨通过更换数学库和使用VTune性能分析工具来优化OpenCAEPoro的实践。
一、数学库优化
数学库是科学计算中的核心组件,对性能有着直接的影响。我们测试了两种流行的数学库:Intel MKL和OpenBLAS。
Intel MKL
在CMakeLists.txt 中设置:
find_package(MKL REQUIRED)
if(MKL_FOUND)
target_link_libraries(${LIBNAME} PUBLIC ${MKL_LIBRARIES})
target_include_directories(${LIBNAME} PUBLIC ${MKL_INCLUDE_DIRS})
endif()
替换后的object time 有所下降,不过下降幅度偏小,大致为53.2秒多。
OpenBLAS
解压下载的文件:
tar -xvf OpenBLAS-0.3.6.tar.gz
cd OpenBLAS-0.3.6
make
make PREFIX=/path/to/OPENBLAS install
替换 /path/to/OPENBLAS 为自己安装 OpenBLAS 的路径。
export LD_LIBRARY_PATH=/path/to/OPENBLAS/lib:$LD_LIBRARY_PATH
在 CMakeLists.txt 文件中链接 OpenBLAS(注意替换路径):
find_library(OPENBLAS_LIB NAMES openblas libopenblas PATHS /path/to/OPENBLAS/lib)
if(OPENBLAS_LIB)
target_link_libraries(${LIBNAME} PUBLIC ${OPENBLAS_LIB})
endif()
检查安装:
ldconfig -p | grep openblas
不过替换该数学库后的效果仍然不明显。
分析
其实还可以试试Eigen等其他数学库,不过我也没来得及试试。
不过testcase1所计算的矩阵式比较小,也可以考虑搜集资料改进一下这部分运算。
二、VTune性能分析
1.分析
vtune -collect hotspots -result-dir result1 mpirun -np 9 ./testOpenCAEPoro ./data/test/test.data verbose=1
2.查看
vtune -report summary -r result1
3.分析(部分截图)
因为对vtune不太熟悉,所以得到结果也不知道从哪方面改进(抱歉)。
三、多机运行
4*50时大致时间为:
4*55时大致时间为:
(其实应该先多机跑的,浪费了好多时间)
四、改进函数
pestis_solve:
改进了循环部分(代码能力有限)。
Partition.cpp文件中的SetDistribution函数
1.可以使用 unordered_map(哈希表),减少查找发送缓冲区的时间复杂度。
2.预先检查哈希表中是否存在键值,进而减少循环中的条件分支。
3.使用 vector 的 push_back 方法来添加新元素,而不是在循环中多次调用 vector 的 size 。
四、其他小改进
给vector提前分配空间
有部分可以被计算出来的,可以提前reserve分配好合适的空间。
提高I/O性能
可以通过使用缓冲区来收集数据,一次性写入或者读取,减少I/O操作的次数,也可以通过异步I/O操作或者非阻塞I/O,发起一个I/O请求后立即返回,程序继续执行其他任务,直到I/O操作准备好再回来处理。
总结
尝试的优化方法并不尽人意,并且代码修改这部分有待加强,能力还有待加强。