简洁版本的Openblas实现了一个intel x86_64 sgemm,但
保留了
Openblas骨架和精髓
个人觉得Openblas项目中可以借鉴的地方:
1.多线程快速切换(利用job,去更新参数,而不是释放和重新生成新线程)
2.矩阵分块(参考gotoblas的论文),cache利用(尤其在多线程的情况下控制好L3-L1cache的利用程度,最大程度保证cpu不断流)
3.计算单元汇编级优化,但在工程编译、扩展上有要求灵活快速,所以Openblas编译时候对宏的利用发挥到了极致
目前想到可以改进的地方::
1.线程切换时候用到的job可以使用连续物理内存,确保证缓存在cache中;(至少malloc的比数组要慢,还没尝试mmap)
2.针对不同的矩阵维度可以提前生成汇编 ;比如不常见的27*480000这种矩阵,可以用脚本语言生产汇编代码直接在汇编级代码中展开大循环(
尤其在faster rcnn优化上,因为网络模型固定之后,矩阵维度也就固定了,针对固定的维度去做汇编级别的展开(手写几万行的汇编要累死,脚本语言可以轻松完成))
参考论文《Anatomy of high-performance matrix multiplication》 http://www.cs.utexas.edu/~pingali/CS378/2007sp/handouts/article.pdf
好像不能传代码附件:贴两张使用到文件和编译过程,也可以顺藤摸瓜了解