一 roofline
roofline分析
内存访问
对于内存访问来说,我们是一次性加载整个向量,然后一次性保存它。
Bytes=2*N*4(每个浮点值占四字节)
浮点计算量
先求max(x)//N次浮点操作,再求x-m//N次浮点操作,exp=e^x//N次浮点操作,s=sum(exp)//N次浮点操作,out=exp/s//N次浮点操作。
FLOPS=5*N
这样得到的信息就是这个算子每加载8字节,我们进行5次浮点运算。
TheoreticalMaximum = (5/8)*理论带宽 1TB/s = 625GFLOPs//理论最高算力
benchmark/batch_size = 128
这里数据看着还是有问题(因为torch和triton实现的kernel表现出来的算力比理论算力都高),所以作者重新分析了一下cuda存储是怎么实现的?

nv的GPU使用了所谓的write-back cache,这本质上意味着在kernel执行期间,我们只写入L2 cache,而全局内存在我们释放缓存块时接收数据。由于我们L2 cache的写入速度远高于global memory的读取速度。唯一的瓶颈就是从global memory中读取,所以我们理论的最大计算强度增加了2倍。(别人的理解:意思是加载到L2上的数据,在内核执行的时候在上面的读和写因为速度很快所以可认为忽略,只计算L2开始从全局读的那部分,2倍也只能说是大概估计)(我的理解:对于内存访问的计算来说,涉及到“一次性加载整个向量,然后一次性保存它”,但是从L2 cache读到shared memory中的速度很快,甚至可以忽略不计,所以主要受限的还是从global memory中加载整个向量,所以内存访问量大概就是N*4,原先的8*N的一半,理论算力


1536

被折叠的 条评论
为什么被折叠?



