キャッシュブロッキング|行列積高速化#5
この記事は、以下の記事を分割したものです。
[元の記事]行列積計算を高速化してみる
一括で読みたい場合は、元の記事をご覧ください。
上記で、メモリアクセスパターンの違いによって、明らかに計算速度の違いが見られました。これは、ストライドアクセスだとCPUが読み込んだキャッシュラインの一部しか利用せず、キャッシュメモリの利用効率が著しく低下しているためです。
そこで、まずキャッシュメモリの利用効率を向上することを目指します。そのためには、利用するデータ量を制限し、データの再利用効率を高めることが必要です。データ量を制限するプログラミング技法はブロッキングでした。
ここでは、転置なしの行列積コードのブロッキングを試行していきます。
ブロッキングのサイズは、各階層のキャッシュメモリ容量から決定します。
5-1. ブロッキングサイズの設計
ブロッキングサイズを計算で出す方法は、下記記事で説明してあります。ここでは、直感的に図で示したいと思います。
L3キャッシュの容量は、コアあたり2MBでしたので、パネルサイズを次のように見積もります。行列AはM×K、行列BはK×N、行列CはM×Nと行列サイズが決まっているので、M,N,K毎のパネルサイズをキャッシュ容量に合わせて調整します。MacBookの場合、下図によると、PANEL_M=256、PANEL_N=256、PANEL_K=256としておくとよさそうです。
次に、L2キャッシュの容量は、コアあたり256KBでしたので、ブロックサイズは下図のように見積もれます。これによると、BLOCK_M=128、BLOCK_N=64、BLOCK_K=128となります。
最後に、L1データキャッシュは32KBなので、タイルサイズを次のようにします。
結果として、TILE_M=32、TILE_N=32、TILE_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
実際のキャッシュブロッキングに関しては、有料とさせていただきます。
次の記事
ここから先は
¥ 100
この記事が気に入ったらサポートをしてみませんか?