モノトーンの伝説日記

Apex Legends, Splatoon, Programming, and so on...

ガチメタル(Apple 系デバイスで使える Metal API の方です )

 タイトルの響きが気に入ったのでこれを採用しました。

 こんにちはモノトーンです。

 今日は,macOS で Metal 関連の実装をしていて,それについてちょっと書いていこうと思います。

1. CPU と iGPU と dGPU

 ゲーミングノートPC や MacBook Pro 15" では,discrete GPU(以後,dGPU)が搭載されていますが,これは実は曲者だったりします。

 内臓LCD ←[内部接続]→ iGPU in CPU ←[PCI Express]→ dGPU

 これはご存知の方多いと思いますが。

 そのため,内臓LCD に画面を出力するのって,dGPU からだと比較的遅い処理なんですね。結構オーバーヘッドが多いみたいで,非推奨実装になっているっぽいです。

 ちなみに MacBook Pro の USB-C 経由の画面出力は dGPU なので,dGPU の方が近いです。

developer.apple.com

2. 実装に頭を抱える。

 理屈はわかりますが,アプリが iGPU に近いのか,dGPU に近いのか,そちらを考慮した上で,どう処理するか,って話になりますが。

 例えば,コンピュートシェーダーとグラフィックスシェーダー(オフスクリーンレンダリング)に比重を置いて,それをダウンロードすることでデータを扱う場合はやはり dGPU を使いたいんですよね(切実)

 でもこれを見ている限り,そのまま present 命令を投げると多分,PCIe バス経由で画像データが転送されるので,多分これの待ち時間が結構長い気がします(知らんけど)

 present 命令で待ち処理をしなければ,多分そこまで影響でないですよね,多分。って思いながらとりあえず実装してみることにします。

3. 何が問題なのか検討

 例えば私の持っている MBP は Radeon Pro 460 4 GB を搭載していますが,4 GB GDDR5 128 bit bus で RAM Freq. 1270 MHz ですね。これで 81 GB/s です。

 一方で,CPU - dGPU は PCIe 3.0 x16 でしょうから,一方向 15.75 GB/s ですね。

 実際問題,バスの太さは十分だと思うので,やはりレイテンシーがいちばんの問題なんでしょうね。転送に 5 ms かかるとしてもかなりのオーバーヘッドですから。

 60 fps なら 1 フレーム 16.67 ms 以下ですから,転送に 5 ms かかる場合,10 ms ぐらいが処理できる時間になりますからね。

まとめ

 脈絡ないエントリーでしたがメモということで!

 もう少し実装進んだら具体的な中身とかかけると思うのでその辺りかなぁ。実際にプロファイリングして,手動でダウンロードした方がパフォーマンスいいのかその辺りについては 2, 3 週間後ぐらいにかけたら!