如何计算调用cuBlas的MPI程序的实际FLOPS?
问题解答
一、手动计算FLOPS的“浮点操作数”说明
你提到的“模型数”其实是实际执行的浮点操作总次数,不是算法的渐近复杂度O(f(N))(比如O(N³)是GEMM的复杂度阶,仅用来描述规模增长趋势,不是具体操作数)。
以GEMM(矩阵乘法)为例:
- 对于M×K矩阵A与K×N矩阵B相乘得到M×N矩阵C,每个C[i][j]的计算需要K次浮点乘法 + (K-1)次浮点加法,总操作数为
M*N*(K + (K-1)) = M*N*(2K-1) - 行业内为了简化计算,通常近似为
2*M*N*K(当K较大时,2K-1与2K的差异可忽略)
你举的4×5与5×6矩阵相乘的例子:
- 准确总浮点操作数是
4*6*(5+4) = 216 - 近似值为
2*4*6*5 = 240 - 若耗时0.5秒,准确FLOPS为
216/0.5 = 432,近似FLOPS为240/0.5 = 480
注意:cuBLAS的GEMM实现会做分块、向量指令等优化,但手动计算的操作数依然基于标准矩阵乘法逻辑,可用来和工具测得的结果做对比参考。
二、支持MPI+CUDA/cuBLAS程序的性能分析工具
Nsight System和Nsight Compute完全支持分析调用CUDA函数的MPI程序,你可能没掌握正确的使用方式:
1. Nsight System(全局性能分析,覆盖FLOPS、内存使用等)
通过MPI启动器配合Nsight System的profile命令,捕获所有MPI进程的CUDA活动:
mpiexec -n <进程数> nsys profile --stats=true ./你的MPI-cuBLAS程序
运行后生成的.nsys-rep报告文件,可查看:
- 每个MPI进程中cuBLAS kernel的执行时间、浮点吞吐量(FLOPS)
- GPU内存使用率、数据传输耗时
- MPI通信与CUDA计算的重叠情况
2. Nsight Compute(精细化kernel分析,聚焦FLOPS细节)
若需深入分析单个cuBLAS kernel的FLOPS、指令吞吐等细节,可先通过Nsight System定位目标kernel,再针对特定MPI进程启动分析:
# 替换<kernel名称>为实际cuBLAS kernel名,针对第0个MPI进程分析 mpiexec -n <进程数> ncu -k <kernel名称> ./你的MPI-cuBLAS程序
它会输出kernel的浮点操作数、实际执行时间、峰值FLOPS利用率等精准指标,比手动计算更可靠。
其他可选工具
nvprof虽官方标记为废弃,但部分CUDA版本仍可使用,启动方式类似:mpiexec -n <进程数> nvprof ./你的MPI-cuBLAS程序,适合快速排查问题。
内容的提问来源于stack exchange,提问作者TherLF
相关产品推荐
相关产品推荐

