Demo介绍
- Demo获取地址:matrix_multiplication,运行平台为基于鲲鹏920的服务器,物理核数为128核,操作系统为openEuler 20.03 (LTS)。
- Demo主要用于完成两个矩阵的相乘。
图1 矩阵相乘示意
- 编译方式。
主要使用Make,支持编译出两个二进制matmul_nokml,matmul。
构建KML(Kunpeng Math Library)版本时,需要先安装鲲鹏数学库,并设定KML_INCLUDE和KML_LIB环境变量。
- Demo用法。
./matmul size method test_correctness
- size:矩阵的行列大小,需要为2的次方,例如512, 1024, 2048, 4096等。
- method:matmul_nokml可以使用0-5,matmul可以使用0-6。
- test_correctness:如果选择true,则会对矩阵计算的准确性进行校验,默认为false。
表1 method描述表 method
描述
0 (base_matmult)
基础串行计算。
1 (parallel_matmult)
在0(base_matmult)的基础上实现一般OMP并行计算。
2 (transpose_B_matmult)
在1 (parallel_matmult)的基础上增加矩阵转置优化。
3 (change_loop_order_matmult)
类似2(transpose_B_matmult)的优化, 通过改变计算循环方式。
4 (block_transpose_B_matmult)
在2(transpose_B_matmult)的基础上增加矩阵内部块循环优化。
5 (intrinsics_transpose_B_matmult)
在4(block_transpose_B_matmult)的基础上增加arm neno向量化计算优化。
6 (kml_matmult)
使用鲲鹏数学库优化。
method 2和method 3是同一种优化手段的变体,是用于改进读取矩阵B的内存访问顺序。
- Demo默认使用float类型进行计算,增加编译选项“-DDOUBLE_TYPE”可使用double类型进行计算。
- 通过修改OMP_NUM_THREADS可以设定并行数,不设定时默认使用物理核数,使用method 6(block_transpose_B_matmult)时,需要显式指定并行数。
父主题: Roofline调优分析