观察可能的研究方向
https://github.com/ggml-org/llama.cpp/issues/9827
// optimization 1 // A // [1,2] // [3,4]
// A' // [1,3] // [2,4]
// a[1,3,2,4] // a[A(0,0),A(1,0),A(0,1),A(1,1)]
//X(p)是一次取A'的一行(即是取A的一列)的始地址,步长lda就是A的行数,A'的列数 //此处计算了A'*B //此处巧妙的转化原来的列主序存储变为行主序存储的计算,矩阵转置取得一行对应原来的一列,另一个矩阵取一列,都对应着计算机中的行主序存储
//optimization 2 //利用局部性原理,尽可能的计算更多的结果
//optimization 1x4_3 //更改利用局部性原理的形式,性质没有发生改变
//optimization 1x4_4 //取消了AddDot函数的使用,性质没有发生改变
//optimization 1x4_5 //将原来四个独立的循环计算合并为1个,利用了局部性原理 //还是相同的利用局部性原理,同2处,但是由函数变为统一计算,更充分地利用了局部性原理 //例如A(0,p),即A的P列,A'的P行可以复用四次
//optimization 1x4_6 //使用指针代替A矩阵的首地址 //使用变量代替原有的C矩阵的值,只在最后修改一次 //这一步获得了可观的性能提升
//optimization 1x4_7 //使用指针代替原有的B矩阵的值,进一步降低了取B矩阵地址的次数 //这一步在较大的矩阵获得了提升
//optimization 1x4_8 //将原有的四次循环展开,企图利用局部性原理 //在性能上有下降,这可能意味着编译器在之前做了不为我们所知的优化
//optimization 1x4_9 //使用间接寻址,一次循环只使用一个B矩阵的地址,只在四次计算之后再修改使用的B矩阵的地址,减少计算次数 //编译器似乎含有这种优化,没有较大提升