类似设计方案:block 3x32 4x24 6x16 12x8
原始方案:6x16对输入进行重排,导致耗时很长
新方案好处:整体的IO次数降低,会有cache miss严重,input不重排,weight利用率更好(空间局部性和时间局部性)
使用小shape测试,性能提升1/4,但是未进行数据预取和指令流水线展开,还有优化空间。
使用模型测试,未提升1/4 分析:未进行数据预取和循环展开,以及未对L1进行分析。
3x32 和L1cache分析:
原始没有提升的shape是[8, 2048]X[2048, 512]这么大shape,cahce miss很严重,远超过了L1 ,cache冲突严重,omg!!
对2048进行分片!
尽可能占用L1 cache:设分片长度是y
总计cache使用量:(3*x + 32 * x) * 4 、 1024 <= 32kb ==》 x<=234
故取:x = 234 、 16 * 16 = 224 (真开心cache miss最低了,利用率最高)(分片带来的问题是不断加载dst!!)
写代码测试:
纳尼:224 192 160 128 96 最好的是128时候,omg L1cache确实咩有用完啊!!
为毛cache使用更高了,导致了严重的cache miss问题
可能还是冲突了,我们预计左矩阵分块一直常驻内存么。
左右矩阵的思考:谁大谁在先常驻内存!! 这样L2到L1 IO最低
x86:右矩阵常驻内存
arm:左矩阵常驻内存