Link: Performing Calculations on a GPU | Apple Developer Documentation

Performing Calculations on a GPU | Apple Developer Documentation

Mac には Metal があっていいなあとひやかす。Metal が CUDA より良いとは思えないが、それでも GPGPU の環境が標準でついてきてラップトップでもさくっと動かせるというのは Linux や Android で暮らしている身からすると羨ましい。Windows プログラマも同じであろう。ラップトップの Intel GPU じゃ GPGPU も盛り上がらないだろうし、そもそもコード書く準備がかったるいからね Windows. Linux はコードを書くのは構わないけど GPGPU の API がないのは同じ。

読書活動 PMPP Ch. 5

CHAPTER 5 Memory architecture and data locality

  • Shared memory のサイズは実行時に計算して kernel call の configuration <<..>> の中に指定できる。
  • A100 の shared memory は 162KB / SM. L1 cache より小さい。自分の買った T1000 という GPU はもっと小さいことでしょう・・・。同一世代の SM は値段によらず同じ構成なのかな。たぶんそうなのでしょう。
  • “Shared Memory” は on-die なのに “Local Memory” が off-die という命名はどうなんだ・・・とおもったが、shared memory のサイズの小ささを見ると local memory どう考えても on-die に置けませんね、とある種の納得がある。
  • レジスタがめちゃくそ沢山ある (数万?) のに対し shared memory が妙に小さいの、CPU から考えると不思議。レジスタが沢山必要なのはわかるんだけど。
  • 行列計算の例は memory locality の説明用には素晴らしい。一方でこういうコード書かないと性能がでないなら GPU でプログラミングとか無理ぽ・・・というきもち。機械学習してる人とか GPU つかってるけどカーネル自分で書いてるのは一握りのエリート/底辺レイヤのひとだけなのだろうねえ。そしてこの本はそういう人向けに書かれているのだった。

GPGPU, HPC の難しさを垣間見る章でありました。

ARM GPU Cores

によると、Mali GPU には “Shader Core” というのが 10 個くらい入っている。Mali-G72 は最大で 32 core までいけるらしいが、そういうのはデスクトップとか用なのでしょう。 この Shader Core が CUDA でいう SM 相当で、世代に名前がついている。

上のリンクによると Valhall という世代は “processing unit” が、2 つ, Bifrost 世代は 3 つ入っている。この “processing unit” が CUDA でいう “CUDA Core” 相当だと思えばよさそう。Utgard という世代は vertex unit と fragment unit がわかれており、unified shader architecture になってない。

Bifrost というやつは 16fp が 8 個 SIMD できると書いてある。この計算と3 つ processing unit があるという事実の関係はよくわからない。

そしてこいつらは SM みたいに thread を oversubscribe して latency tolerance をたかめる、みたいなことはどれくらいしてくれるのだろうね。


そういえば Apple の M1 Ultra は 64 core GPU で、てきとうにぐぐった記事によるとベンチマークのスコアは RTX 3090 に対し 2x+ 遅くらいである。RTX 3090 はこの Wikipedia ページによると SM が 82 個で、各 SM に 128 CUDA Core くらいある。

RTX の SM 82 個と M1 Ultra の 64 core は comparable である。とすると Apple GPU の各コアの processing unit みたいなやつは 128 を半分くらいにして 64 個くらいはいってるのかな?(こんな雑な計算していいのかな?)

ここでは M1 (無印) GPU は “the M1 GPU supports 24576 = 1024 * 24 simultaneous threads” と言っているが、ハードウェアが並列実行できる SIMD の幅はよくわからない。それは開示されていない、という理解でよさそう。

一歩さがって CUDA Core per SM の数をプログラマが意識する必要があるのかというと・・・無いな。重要なのは SM が持てる thread の数, thread block の数, register の数とかで、これは M1/Metal でもクエリできるっぽい。

つまり SM あたりの CUDA Core の数というのは基本的にマーケティング用の数字盛り上げツール、マニアのトリビアであって、特に有用ではないのだろうな。

とはいえ上の 64 という processing unit per GPU Core の概算はさすがに一桁くらい違いそうな気がする。だって ARM の GPU は 3? 8? とかなわけです。そして M1 も Axx もそういうコア単位のデザインは共有してると思われるわけです。8-20 倍ということはないだろうさすがに。


まとめると

  • ARM の GPU は随分遅そうである。そしてメモリアクセスの隠蔽とかがどうなってるのかはさっぱりわからない。レジスタの数もなにもかもわからない。
  • Apple M1 の GPU もよくわからない。ただ Metal のおかげでいくらかは性能をクエリできる。レジスタもいっぱいあるので NVIDIA GPU 的な latency tolerance は期待できる。
  • Apple の M1 Ultra がなぜ RTX 3090 と同じ桁くらい速いのかはよくわからない。

NVIDIA はプロプリエタリなりに情報が色々オープンで偉かった。AMD とか Intel とか調べてないけどどれくらいアーキテクチャを開示してるのだろうね。