C言語は行優先の並び順でデータを格納するため、行列の一行から連続する4つの要素をNEONレジスタに格納することは簡単です。
|
|
それでは、行列m_b
の第j
列のk
番から始まる4つの連続した要素をsrc2
に格納したい場合はどうすればよいでしょうか?
もちろん、vsetq_lane_f32
を使用することができます。
|
|
1行で書くこともできます。
|
|
しかし、これはとても不器用に見えます。すべての時間をアドレス指定に費やすようです。
実際に$1300$次正方行列の掛け算を行うと、この方法で〝最適化〟されたコードは、普通の3重ループに比べて遅くなります。
では、どのように書けばよいでしょうか?
$A\times B$では、列を取得するためにアドレス指定のコストがかかります。しかし、行だけを取得する必要がある場合は、そこまで時間がかかりません。したがって、$A\times B^{\mathrm T}$を計算することができます。$A$と$B$はどちらも、行の連続した要素だけを取得するだけで済みます。$A\times\left(B^{\mathrm T}\right)^{\mathrm T}=A\times B$を計算することは簡単です。最終的な解決策は、以下のようになります。
|
|