![見出し画像](https://assets.st-note.com/production/uploads/images/38746989/rectangle_large_type_2_66bf7497b4df7e08528a59e64af6a20b.png?width=1200)
行列転置をコピー関数で吸収する|行列積高速化#11
この記事は、以下の記事を分割したものです。
[元の記事]行列積計算を高速化してみる
一括で読みたい場合は、元の記事をご覧ください。
ここまで、行列Aと行列Bのどちらも転置しない場合を扱ってきましたが、転置行列にも対応する必要があります。しかし、行列Aと行列Bの転置する場合と転置しない場合について、ここまでの作業を繰り返すのは大変です。実は、もっと簡単に転置行列の場合を吸収してしまう方法があります。
前述で作成した行列Aと行列Bのコピー関数は、実は次のような対応関係にあります。
(A)行列Aのコピー関数 = 転置ありのコピー関数
(B)行列Bのコピー関数 = 転置なしのコピー関数
転置行列の転置行列は転置なしの行列ですから、行列Aと行列Bを転置する場合には、次のようにコピー関数を入れ換えることで対応できます。
(A)行列Aの転置コピー関数 = 転置なしのコピー関数
(B)行列Bの転置コピー関数 = 転置ありのコピー関数
そこで、対応方針としては、前記で作成したコピー関数を入れ換え可能にすることで、転置行列に対応することとします。そのためには、コピー関数のインターフェースを合わせる必要があります。また、条件分岐で入れ替えると分岐コストがかかるため、関数ポインタで差し替える方針で行きたいと思います。
さて、現在のコピー関数の呼び出し方法は、次のとおりです。実は、このままだと差し替えることができませんでした。
// On L2-Cache Copy for A
block2d_info_t infoA = {M2,K2,MYBLAS_TILE_M,MYBLAS_TILE_K};
myblas_dgemm_copy_t(A+lda*k2+i2,lda,A2,&infoA);
// On L2-Cache Copy for B
block2d_info_t infoB = {K2,N2,MYBLAS_TILE_K,MYBLAS_TILE_N};
myblas_dgemm_copy_n(B+ldb*j2+k2,ldb,B2,&infoB);
上記の、行列Aを転置する場合、myblas_dgemm_copy_t関数をmyblas_dgemm_copy_n関数に置換しても、計算結果が正しくなりません。
具体的なやり方は、有料にさせていただきます。
次の記事
ここから先は
6,846字
¥ 100
この記事が気に入ったらサポートをしてみませんか?