由于C语言是行主序存储的,所以如果要把矩阵一行中的连续四个元素装入NEON寄存器很简单:
|
|
那如果我想把矩阵m_b
第j
列中从第k
行开始的四个连续元素装入src2
怎么写呢?
当然,用vsetq_lane_f32
来写是可行的:
|
|
或者写成一行:
|
|
怎么看怎么蠢,优化掉的那点儿时间全拿来寻址了。
经测试,两个$1300$阶方阵相乘,用上面这种写法“优化”过的代码,总是比普通的三重循环要慢。
你是懂负优化的。
所以应该怎么写呢?
观察一下就能发现,算$\boldsymbol{A}\times\boldsymbol{B}$需要取列耗时长,取行的话倒是很方便算,自然想到$\boldsymbol{A}\times\boldsymbol{B}^{\mathrm T}$很好算,$\boldsymbol{A}$和$\boldsymbol{B}$都只需要取一行中的连续元素,于是自然想到可以算$\boldsymbol{A}\times\left(\boldsymbol{B}^{\mathrm T}\right)^{\mathrm T}=\boldsymbol{A}\times\boldsymbol{B}$,于是终极解法是:
|
|