見出し画像

キャッシュブロッキング|行列積高速化#5

この記事は、以下の記事を分割したものです。
[元の記事]行列積計算を高速化してみる
一括で読みたい場合は、元の記事をご覧ください。

上記で、メモリアクセスパターンの違いによって、明らかに計算速度の違いが見られました。これは、ストライドアクセスだとCPUが読み込んだキャッシュラインの一部しか利用せず、キャッシュメモリの利用効率が著しく低下しているためです。

そこで、まずキャッシュメモリの利用効率を向上することを目指します。そのためには、利用するデータ量を制限し、データの再利用効率を高めることが必要です。データ量を制限するプログラミング技法はブロッキングでした。

ここでは、転置なしの行列積コードのブロッキングを試行していきます。

ブロッキングのサイズは、各階層のキャッシュメモリ容量から決定します。

5-1. ブロッキングサイズの設計

ブロッキングサイズを計算で出す方法は、下記記事で説明してあります。ここでは、直感的に図で示したいと思います。

L3キャッシュの容量は、コアあたり2MBでしたので、パネルサイズを次のように見積もります。行列AはM×K、行列BはK×N、行列CはM×Nと行列サイズが決まっているので、M,N,K毎のパネルサイズをキャッシュ容量に合わせて調整します。MacBookの場合、下図によると、PANEL_M=256PANEL_N=256PANEL_K=256としておくとよさそうです。

L3キャッシュとパネルサイズ

次に、L2キャッシュの容量は、コアあたり256KBでしたので、ブロックサイズは下図のように見積もれます。これによると、BLOCK_M=128BLOCK_N=64BLOCK_K=128となります。

L2キャッシュとブロックサイズ

最後に、L1データキャッシュ32KBなので、タイルサイズを次のようにします。

L1キャッシュとタイルサイズ2

結果として、TILE_M=32TILE_N=32TILE_K=32としました。

最後に、計算したパネルサイズ、ブロックサイズ、タイルサイズは、マクロ定義しておきます。

#define MYBLAS_PANEL_M  256

#define MYBLAS_PANEL_N  256

#define MYBLAS_PANEL_K  256

#define MYBLAS_BLOCK_M  128

#define MYBLAS_BLOCK_N   64

#define MYBLAS_BLOCK_K  128

#define MYBLAS_TILE_M    32

#define MYBLAS_TILE_N    32

#define MYBLAS_TILE_K    32

実際のキャッシュブロッキングに関しては、有料とさせていただきます。

次の記事

ここから先は

8,695字

¥ 100

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