Coelacanth's Dream

Raven2 の GPU L2キャッシュは 128KB

オープンソースで開発されるユーザーモードドライバー Mesa3D に投稿されたパッチから、Raven2 (Dali/Pollock) APU が持つ GPU L2キャッシュのサイズが 128KB であることが明かされた。
Raven2 (Dali/Pollock) APU は CPUに Zenアーキテクチャ 2-Core/4-Thread、GPU に Vega/GFX9 (gfx909) 3CU を持つ、小型な省電力 SoC。GF 14nmプロセスで製造される。

Raven2 GPU L2$

今回のパッチで、Raven2 の GPU L2キャッシュはブロックあたり 64KB とされ、
別のオープンソースで開発される AMDVLK の一部を構成する PAL (Platform Abstraction Library) のコードには、2ブロックあると記述されている。
そして、Raven2 の GPU L2キャッシュは計 128KB となる。

ちなみに、コード中に使われている TCCTexture Channel Cache の略とされている。1
そのフルネームが記述されることは最近ではなくなり、また資料中で解説されることもほとんどなく、半ば記号と化している。

      case CHIP_RAVEN2:
         info->l2_cache_size = info->num_tcc_blocks * 64 * 1024;
         break;
        else if (AMDGPU_IS_RAVEN2(m_nullIdLookup.familyId, m_nullIdLookup.eRevId))
       {
           pChipInfo->doubleOffchipLdsBuffers = 1;
           pChipInfo->gbAddrConfig            = 0x26010001; // GB_ADDR_CONFIG_DEFAULT;
           pChipInfo->numShaderEngines        =    1; // GPU__GC__NUM_SE;
           pChipInfo->numShaderArrays         =    1; // GPU__GC__NUM_SH_PER_SE;
           pChipInfo->maxNumRbPerSe           =    1; // GPU__GC__NUM_RB_PER_SE;
           pChipInfo->nativeWavefrontSize     =   64; // GPU__GC__WAVE_SIZE;
           pChipInfo->minWavefrontSize        =   64;
           pChipInfo->maxWavefrontSize        =   64;
           pChipInfo->numPhysicalVgprsPerSimd =  256; // GPU__GC__NUM_GPRS;
           pChipInfo->maxNumCuPerSh           =    3; // GPU__GC__NUM_CU_PER_SH;
           pChipInfo->numTccBlocks            =    2; // GPU__TC__NUM_TCCS;

L2キャッシュサイズが何故今更分かったか、明かされたかと言えば、オープンソースドライバー等で最適化に使われるのは、基本、メモリ帯域や RB (Render Backend) に対応する L2キャッシュブロックの数であり、サイズ自体はあまり使われていないからだ。
今回 L2キャッシュサイズの情報が追加されたのは、ドライバーのトレース機能から出力された情報を解析する Radeon GPU Analyzer (RGA) に使われるためで、オープンソースドライバーでも RGA への対応を強化する考えがあるものと思われる。

Raven/Picasso APU 等は資料中で GPU L2キャッシュに 1MB 持つことが触れられていたが、Raven2 は省電力低コストという特徴のためか、個人的には他の APU よりもひっそりしているという印象を受ける。

以前に、Fritzchens Fritz | Flickr 氏が撮影したダイショットを元に各ブロックを推測したことがあったが、その時には気が付けなかった。
言い訳をすると、SoC として多くの機能を持つプロセッサは、各ブロックが入り組んだ構造をしており CPUコアや GPU CU 等の分かりやすいもの以外 2つを並べて見比べても、あるブロックが何のユニットで、片方のどれと対応するかを推測することは難しい。
AMD Raven2 のダイ観察 & Zen系 APU を比較 | Coelacanth’s Dream

Raven2 の GPU部は Raven/Picasso のそれから規模を大きく減らしており、CU数は約1/4、RB は 2基から 1基に、そして L2キャッシュは 1/8 の規模となる。
AMD GPU は Vega/GFX9 世代から、L2キャッシュのブロックあたりのサイズは 256KB を基本としており、RDNA/GFX10 世代もそのようになっている。( Polaris10/11 等、GFX8 世代でもブロックあたり 256KB の GPU は存在する)
L2キャッシュのサイズは選択でき、rdna-whitepaper.pdf には 64KB から 512KB の構成を取ることができるとある。
それでも RDNA/GFX10 世代では 256KB の構成を取り続けていることから、性能や効率、必要とされる面積という点で 256KB が最適だという判断があったはずで、
比較的最近の APU でありながらブロックあたり 64KB の構成を取ったことは、Raven2 が省電力低コストという特徴を強める要素だと言える。

## Raven2 Diagram

 +- ShaderEngine(00) -----------------+
 | +- ShaderArray(00) --------------+ |
 | |  ==== ====  CU (00) ==== ====  | |
 | |  ==== ====  CU (01) ==== ====  | |
 | |  ==== ====  CU (02) ==== ====  | |
 | |  [ RB+ ]                       | |
 | |  [ Rasterizer/Primitive Unit ] | |
 | +--------------------------------+ |
 |      [- Geometry Processor -]      |
 +------------------------------------+
 [L2$  64K] [L2$  64K]
## Raven/Picasso Diagram

 +- ShaderEngine(00) -----------------+
 | +- ShaderArray(00) --------------+ |
 | |  ==== ====  CU (00) ==== ====  | |
 | |  ==== ====  CU (01) ==== ====  | |
 | |  ==== ====  CU (02) ==== ====  | |
 | |  ==== ====  CU (03) ==== ====  | |
 | |  ==== ====  CU (04) ==== ====  | |
 | |  ==== ====  CU (05) ==== ====  | |
 | |  ==== ====  CU (06) ==== ====  | |
 | |  ==== ====  CU (07) ==== ====  | |
 | |  ==== ====  CU (08) ==== ====  | |
 | |  ==== ====  CU (09) ==== ====  | |
 | |  ==== ====  CU (10) ==== ====  | |
 | |  [ RB+ ][ RB+ ]                | |
 | |  [ Rasterizer/Primitive Unit ] | |
 | +--------------------------------+ |
 |      [- Geometry Processor -]      |
 +------------------------------------+
 [L2$ 256K] [L2$ 256K] [L2$ 256K] [L2$ 256K]
Raven2 Raven/Picasso
CPU Core/Thread 2/4 4/8
GPU gfx909 gfx902
GPU CU 3CU 11CU
GPU L2$ 128KB 1024KB
GPU RB+2 1 RB+
(8-ROP)
2 RB+
(16-ROP)