見出し画像

行列転置をコピー関数で吸収する|行列積高速化#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

この記事が気に入ったらサポートをしてみませんか?