CGMA(Compute to Global Memory Access)
CGMA的定义是在CUDA程序的某一个区域内每次访问全局存储器时,执行浮点运算的次数,通过对某一个区域代码计算CGMA值,大致可以预估出代码的性能水平。
假如矩阵乘法中的核心代码:
for(int k = 0;k<Width;++k)
Pvalue+=d_M[Row*Width+k]*d_N[k*Width+Col];
该循环的每次迭代都要访问两次全局存储器,一次时执行浮点乘法,另一次时执行浮点加法。一次全局存储器访问取出一个d_M[]元素,另一次去除d_N[]元素,一次浮点操作完成d_M*d_N,其它操作将乘积结果累加到Pvalue中。因此,浮点运算与全局存储器访问操作之间的比值是1:1(或者说比值是1.0)。这个就是CGMA值。
CGMA比值 能够比较准确的体现CUDA中kernel函数的性能。假设CUDA设别的全局存储器访问带宽为200GB/s。单精度浮点数占4个字节,因此对单精度数据的加载不会超过50(200/4)GFLOPS.如果CGMA=1.0,则矩阵乘法中kernel函数每秒可执行的浮点操作不会超过50GFLOPS。50GFLOPS相对于GPU来说很低了,GPU的计算峰值随便都可以达到1500GFLOPS.如果要达到1500GFLOPS,则需要将CGMA的值提到到30,也就是一次访问全局存储器,可以做30次浮点运算。
反映出一种性能优化方式:尽可能少的访问显存,如果避免不了访问显存,那么访问一次显存后,尽可能将能够完成的运算全部完成,再加载别的数据。这种方式原理与CPU性能优化如出一辙。