ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
A15 BionicによるMetalの最新機能
MetalとA15 Bionicを使用してAppやゲームを進化させる方法を紹介し、Apple GPU Family 8の最新のMetal機能を活用できるようサポートします。ロッシー圧縮を使用してメモリを節約する方法、スパースデプステクスチャとステンシルテクスチャを使用したシャドウマッピングの技法、SIMDのシャッフル命令とフィル命令を使用して画像をより速く処理する方法を確認しましょう。
リソース
-
ダウンロード
こんにちは Dave Robertsです AppleのGPU Software Team に所属しています 新しいApple A15 Bionicチップに 搭載されているGPUの アップデート内容を紹介でき光栄です 後ほど GPU Software Teamの 同僚のKatelyn Hinsonが MetalのGPUの新機能について 紹介します また これらの機能を MetalのAppで使用する方法について いくつかのユースケースを 紹介しながら説明してくれます A15 Bionicは MetalのAppやゲームのための パワフルな新しいプラットフォームで CPUやGPU またNeural Engine その他のユーザー体験を向上させる テクノロジーがアップデートされています A15のGPUは A14 Bionicと同じ タイルベースの遅延レンダラと ユニファイドメモリアーキテクチャを 採用しています さまざまな分野で マイクロアーキテクチャの改善を 行ってきましたが パフォーマンスに関わる 重要な変更点がありますので 紹介していきたいと思います A15のGPUには 最大5つの シェーダーコアが搭載されており その5つ目のコアによって 同じGPUコアの周波数で 25%の性能向上を実現しています シェーダコアには F32の浮動小数点演算ユニットが 2倍搭載されており 演算を多用するワークロードでの GPUパフォーマンスを向上させます また A15のGPUでは UIのレスポンスをさらに向上させ バッテリー駆動時間もより長くなっています しかも コードを修正することなく これらの優れた機能すべてを 無料で利用できます しかし それだけではありません A15のGPUにはMetalのAppを さらに優れたものにする新機能が いくつか搭載されています これらの新機能はすべて Apple GPU Family 8と呼ばれる 新しいMetal機能セットに属しています これから Katelynと私は これらの新機能に焦点を当て 機能の概要と活用方法に加え 新機能をサポートしている 新しいMetal APIや シェーディング言語の変更点に ついて説明します まず A15の新しいグラフィック処理機能を 取り上げましょう
ロッシー圧縮は Appのテクスチャの メモリ使用量を使って 画質への影響を最小限に抑えます このA15の新機能を使うと ロスレス圧縮と同じように テクスチャのメモリ帯域幅を節約できます MetalのAppでロッシー圧縮を 使用する方法については この後より詳しく説明します その後 Katelynが A15のGPUでは スパーステクスチャの 既存のサポートが拡張され スパースデプスとステンシル テクスチャの両方へのレンダリングが 含まれたことについてお話しします Katelynは 演算に特化した新機能である SIMDのグループシャッフルと フィル機能についても説明します A15では これらの新しい命令が GPUコアの命令セットに追加されています この機能に加え 画像処理などのユースケースにおいて 演算カーネルの実行時間を短縮することで Appのパフォーマンスを向上させる 方法について説明があります それでは ロッシー圧縮について 詳しく見てみましょう ロッシー圧縮をよく理解するには ロスレス圧縮について考える必要があります 2018年のA12 Bionicで テクスチャのロスレス圧縮が初めて導入され 2020年のA14 Bionicでは この機能にさらに改良が加えられました テクスチャのロスレス圧縮では メモリ帯域幅を節約し 電力の節約になるので 1回のバッテリー充電で Appは安定した処理能力を発揮します ロスレス圧縮では テクスチャのディテールが必ず維持されます 実際 皆さんも A12 Bionic以降のAppで すでにロスレス圧縮を 利用しているかもしれません ロスレス圧縮について詳しくは developer.apple.comで テクニカルトークの 「Discover Metal enhancements for A14 Bionic」および 「Optimizing Texture Data」 の章を参照してください ロッシー圧縮は A15 Bionicの テクスチャ圧縮を 次のレベルに引き上げます ロスレス圧縮によるメモリ帯域幅の 節約に加えて ロッシー圧縮では メモリフットプリントは 非圧縮テクスチャの半分です ロッシー圧縮では可能な限り テクスチャの品質を維持します そして何よりも これをA15の レンダターゲットに簡単に適用して メモリの節約を最大限に 活用することができます ロッシー圧縮を有効にするには テクスチャ記述子の新しい圧縮タイプの プロパティをロッシーに設定するだけです でもなぜロッシー圧縮を 利用するのでしょうか まず ロスレス圧縮でもロッシー圧縮でも 圧縮することでテクスチャのメモリ帯域幅を 大幅に節約できます テクスチャデータをメモリに書き込む前に 圧縮することで メモリ帯域幅を節約するのが 圧縮ユニットの役割です ロスレス圧縮を使用する場合 GPUはテクスチャのディテールを 完全に保持する必要があります そのためMetalでは どれほど圧縮されるか 一切保証できず 非圧縮テクスチャのサイズを 完全にカバーできるだけのメモリを 割り当てる必要があります しかし ロッシー圧縮を使用すれば テクスチャのメモリフットプリントは ロスレス圧縮の半分程度になります A15のGPUが この50%縮小した メモリフットプリントに 収まるようにテクスチャを ロスレス圧縮できない場合は テクスチャ領域の忠実度を下げて 圧縮することになります ロッシー圧縮は ほとんどのピクセル形式と テクスチャタイプに対応しており お使いのレンダターゲットに 使用することができます 多くの場合 Appに追加の修正を 加えることなく テクスチャ上でロッシー圧縮を 有効にできます 品質のトレードオフの許容範囲内で ロッシー圧縮を有効にすることを お勧めします ロッシー圧縮を最も簡単に 有効にできる場所は 品質の低下が一番目立たない 最終的なレンダターゲットです 中間レンダターゲットにロッシー圧縮を 使用することもできます そして 節約したメモリは テクスチャ解像度を上げるなど ほかのことに活用できます また 後処理の変更を確認することで ロッシー圧縮を有効にできる レンダターゲットの候補が 見つかることもあります ここで いくつかのユースケースを 詳しく見てみましょう 最終的なレンダターゲットだけに ロッシー圧縮を有効にした場合の 視覚的な違いを見てください この分割画像では 左側がロスレス圧縮 右側がロッシー圧縮ですが その違いはかなり微妙です これは ロスレス圧縮とロッシー圧縮の ピクセル単位での違いを示したものです 黒のピクセルは差異がないこと 青と緑のピクセルは わずかな差異があること 赤のピクセルは最も差異があることを 示しています この画像の赤と黄色のピクセルは 最終的なレンダリングで最も差異が出た 孤立しているテクスチャ領域です このスクーターの テクスチャ領域の1つを拡大すると ほとんど違いはありません 中間レンダターゲットも ロッシー圧縮をスムーズに使用できます ロスレスとロッシーを見比べるために 水たまりの映り込みの画像を 横に並べてみました これをまたピクセル単位での違いで見ると 水たまりの映り込みは ロッシー圧縮とロスレス圧縮で わずかな差異しかありません さらに ロッシー圧縮で 節約したメモリを使って テクスチャの解像度を上げ ディテールを追加することもできます たとえば これは高解像度の 映り込みの画像です ロスレス圧縮の画像よりも ディテールが鮮明です このすべての作業を同じメモリ使用量で 行うことができます このデモの右側では レンダリング可能なシーン内の すべてのテクスチャに対して ロッシー圧縮を使用しています 動きの中でも シーンは とても安定しているように見えます 左側のロスレス圧縮のシーンと見比べても その違いはほとんどわかりません
Metalでは簡単に Appでロッシー圧縮を使用可能です 方法を説明します まず 通常どおり テクスチャ記述子を初期化し 圧縮タイプのプロパティを ロッシーに設定します 次に ストレージモードを プライベートに設定します 最後に テクスチャを作成します これでAppからロッシー圧縮の機能や ロッシー圧縮で節約したメモリを 最大限に活用できます なお いくつかの例外を除いて ほとんどの構成で ロッシー圧縮のテクスチャを作成できます たとえば 2Dや3D 配列 キューブなどの 一般的なテクスチャタイプには ロッシー圧縮を使用できます しかし あまり一般的でないタイプには 一部非対応です 同様に ロッシー圧縮は 一般的なピクセル形式の ほとんどに対応していますが カラーチャネルを詰め込んだ ピクセル形式には対応していません ロッシー圧縮は レンダターゲットのテクスチャ ブリット操作のテクスチャ テクスチャのサンプルや 読み出しの操作には対応していますが シェーダの書き込み操作で ロッシー圧縮されたテクスチャを 入力することはできません ロッシー圧縮は プライベートストレージ内の テクスチャにのみ対応しており 共有または管理された ストレージノードは使用できません 最後に ロッシー圧縮は MSAA sRGB ミップマップといった 一般的な機能で動作します ロッシー圧縮の互換性について詳しくは developer.apple.comで Metal機能の一覧をご覧ください 要約すると ロッシー圧縮ではロスレス圧縮と 同じメモリ帯域幅を節約しつつ テクスチャメモリを50%節約できます ユースケースやAppでロッシー圧縮を 使用する分量に応じて 大幅なメモリの節約が可能です ロッシー圧縮は テクスチャの ディテールを維持しますが 圧縮されたテクスチャデータが 収まらない場合には 収まらないテクスチャ領域の品質を わずかに下げるだけです そして最後に ロッシー圧縮は 一般的なテクスチャタイプ 一般的なピクセル形式 シェーダの書き込みを除く すべてのGPUアクセスモードに 対応しているので 使いやすい ということでした ではここからKatelynに代わります Katelyn Hinson: ありがとう Dave それでは A15 Bionicに搭載された スパーステクスチャの新しい 機能拡張について紹介します スパーステクスチャは Metalでメモリ容量を管理しつつ 高解像度のテクスチャを作成 するための優れた機能です A13 Bionicで初めて スパーステクスチャが導入され GPUのタイムライン上で テクスチャタイルのマッピングや マッピング解除ができるようになりました スパーステクスチャをAppで使用する 方法について詳しくは 2019年秋と2020年秋の セッションを参照してください A15 Bionicでは スパーステクスチャを機能拡張し デプスとステンシルの アタッチメントが追加されました スパーステクスチャの大原則は 「使わないものは割り当てない」です たとえば このAppでは UI要素の背景にあるタイルを マッピングする必要はありません スパースデプステクスチャと ステンシルテクスチャを使えば このメッシュがかかっているタイルを常に マッピング解除しておくことができます スパースデプスのアタッチメントを使って シャドウマップを最適化できます シャドウマッピングに詳しくない場合は Metalの遅延照明のサンプルで この技法が使用されていますので そちらをご覧ください シャドウパスは ライトの視点で シャドウマップをレンダリングし ライティングパスがそれを読み出します シャドウマップからサンプリングされた テクセルは必ず 投影されたフラスタム内にあります これはスパーステクスチャに 最適なシナリオです ライティングパスがサンプリングする タイルではないため シャドウテクスチャの大部分を マッピングする必要がないという場合です シャドウマッピングを使用したシーンと レンダリングされたシャドウマップです ビューフラスタムの外側にある タイルのメモリは回復できます なぜなら それらのタイルから書き込みや 読み出しを行う必要がないからです カスケードシャドウマッピングは より高度な技法で 複数の独立したシャドウマップを 使用する場合に より効率的にシーンを カバーすることができます カスケードシャドウマッピングでは 高解像度のシャドウマップをカメラの近くに 低解像度のシャドウマップを カメラから遠くに配置します たとえば このシーンでは3つの シャドウマップを重ねています 各シャドウマップは 同じテクスチャ解像度で カメラから遠くなるほど より大きな領域にマッピングされています シャドウマップの 緑でハイライトされている領域は ライティングパスがサンプリングする テクセルを示しています ライティングパスは これらのタイルを 不均一にサンプリングします ヒートマップのように 青いタイルはアンダーサンプリング 赤いタイルはオーバーサンプリングです スパースタイルシャドウマップを使えば これらのテクスチャを サンプリングレートに応じて 解像度を調整できる 単一のサーフェスに 置き換えることができます スパースタイルシャドウマップ (STSM)では 1つのスパースデプスサーフェスを 作成します このサーフェスは固定解像度の テクスチャではなく スパースミップマップチェーンで タイルをマッピングしています この技法を使えば 希望する サンプリングレートに合わせて 必要なタイルのみをマッピングできます これは 各タイルの物理的な解像度を 相対的なミップレベルで表したものです 異なるミップにタイルを マッピングすることで シーン全体のシャドウマップの解像度を 自由かつ効率的に調整できます STSMの技法の主要な手順を説明します まず サンプリングレートに応じて 密度マップを生成します 次に この密度マップに基づいて サーフェスとマップタイルを作成します 次にアダプティブサーフェスへのレンダリング とサーフェスからのサンプリングを行います 密度マップの生成では ほかのパスで参照できる 密度マップのバッファが ジオメトリパスで作成されます 最初の手順はシャドウマップ全体の サンプリングレートを取得することです 想定されるサンプル密度は レンダリングされたジオメトリの シャドウ空間の導関数を 追跡することで計算されます フラグメントシェーダでは アトミックを使用して 2Dグリッドに導関数を格納し shadowUV空間全体の サンプリングレートを取得します 密度マップが生成されたら それを使ってスパースデプス テクスチャのタイルをレイアウトし 目次バッファを作成します この目次バッファは ライティングパスで使用します まず デプステクスチャの タイルをマッピングしますが サーフェスを繰り返し分割して 最下層のミップから順に 各ミップレベルのマッピングを スケジューリングしていきます マッピングするタイルを判断するには まず密度マップで 現在のミップの サンプリングレートを確認します この例では 現在のミップは不十分ですが 次のミップマップレベルだと問題ないことが 密度マップからわかります この場合 次のミップをマッピングして 現在のミップのマッピングを解除すれば タイル全体の品質が上がります もう少し複雑なシナリオを 考えてみましょう この密度マップからすると 現在のミップは 4つの領域の少なくとも1つで 申し分ありません 次のミップでは サンプリングレートと密度マップが 4つの領域の2つでは 目標を満たしていますが 残りの2つは目標レートを下回っています この場合 現在のミップで このタイルをマッピングし 次のミップでタイルの半分を マッピングします 次に コンピュートシェーダが UVレベルとミップレベルを変換する 2Dテーブルを書き出し これを目次(TOC)バッファに格納します STSMからテクセルをサンプリングする前に ライティングパスでTOCバッファが 読み込まれ テーブルにインデックスを付けて ミップを取得します このミップは シャドウマップを サンプリングする際に 明示的なLODパラメータとして 使用されます 次にスパースシャドウマップの レンダリングをします まず TOCバッファを使って シャドウをカリングしてから 間接的な描画コマンドをエンコードして スパースデプステクスチャに レンダリングします 間接的なコマンドのバッファで 各ミップマップを個別に埋めて サーフェスをレンダリングします このタスクにはICBが最適です というのも コンピュートパスは並行して レジデントエリアに対する 各シャドウジオメトリメッシュのカリングと ソートが行えるからです コンピュートシェーダは タイルの バウンディングボリュームに対して メッシュをテストすることで 描画コマンドを個々のICBにエンコードします シャドウマップを横切る 大きなオブジェクトの場合 シェーダは各ミップの関連するタイルに 対してオブジェクトをテストし 1つでも重複しているタイルがあれば 描画コマンドをミップのICBに エンコードします あるミップに重複するタイルがない場合は そのミップのICBにオブジェクトの 描画コマンドを出さないようにします 各オブジェクトに対して最適化された 描画コマンドのセットは 並列計算スレッドで すべての交差テストを実行することで シャドウをカリングする コンピュートパスによって エンコードされます 赤のメッシュはカメラに最も近いので シャドウマップの11個のタイルに またがり最大の影響を与えました それに対して カメラから最も遠い オレンジのメッシュは 3個のタイルに収まり 最小限の影響にとどまりました 間接的な描画コマンドが完成すると STSMはライティングパスで サンプリングできるようになります この表は STSMをシャドウマッピングと カスケードシャドウマッピングに 比較したものです STSMのサンプリングレートと実質的な品質は シングルシャドウマップとほぼ同じですが 使用するメモリははるかに少なくて済みます 実際 同じ解像度であれば メモリフットプリントは1%以下になります この詳細な説明が MetalのAppで スパースタイルシャドウマップを使って 効率的かつ高品質なシャドウを 作成する方法のヒントになれば幸いです 最後に A15でMetalの演算機能に 新たに追加された SIMDのシャッフルとフィルを紹介します 最新の画像処理では エッジ検出 ぼかし シャープなどのフィルターに 畳み込みカーネルが適用されています これは 最新のレンダリングのデモで 撮影した画像に 畳み込みを適用したものです このようなワークロードは通常 テクスチャサンプリングや スレッドグループメモリからの 読み出しによって制限され GPUの演算ユニットが十分に 活用されていません Appleシリコンでは Metalのコンピュートシェーダで使用できる SIMD命令が豊富に用意されており こうしたワークロードの最適化に役立ちます SIMDグループのスレッドは ロックステップで同時に実行されるため SIMDグループ関数は このロックステップ実行を利用して スレッド間でデータを共有します 既存のSIMD関数について詳しくは A13 BionicとA14 Bionicの 概要セッションをご覧ください では 新たに用意されたSIMD命令に ついて説明しましょう A15 Bionicの新機能は SIMDへの対応 およびクアッドの シャッフルとフィルです これらの命令は 先ほど紹介した エッジ検出畳み込みのような スライディングウィンドウの画像処理を 改善するよう設計されています また これらの機能は SIMDグループ内の 隣接するスレッド間で データを共有することで メモリを使用せずに 演算の ワークロードを最適化します まず A13で初めて導入された クアッドのシャッフルダウンの 動作を見てみましょう データバッファには A B C Dのコンテンツがあり これらはクアッドのスレッドである 0 1 2 3のレジスタにロードされます シフト1でシャッフルダウンを適用した場合 スレッド0 1 2のレジスタデータは スレッド1 2 3のデータを取得します 計算されたクアッドレーンIDが ラップアラウンドすることはないので 計算結果のスレッド3には シフトされていない値のDが表示されます 代わりに クアッドのシャッフル命令と フィルダウン命令が使用された場合は 計算結果のスレッド3を更新するために フィルバッファが提供されます そして スレッド0のフィルデータは スレッド3の出力データに シャッフルされます 同様に シフト2でクアッドの シャッフルアップとフィルを適用した場合 AとBはスレッド2と3にシャッフルされ フィルバッファのデータは 出力の下層レーンに シャッフルされていることがわかります Appleシリコンでは SIMDグループは 32スレッドで構成されています そして 同じシャッフルとフィルの動作を SIMDレーン全体に適用でき 下層のデルタレーンは 上層レーンのフィルデータで補充できます また 新しいSIMDとクアッドの シャッフル命令 フィル命令には オプションでモジュロ引数があります これにより ユーザーが指定する ベクトル幅に対応できます モジュールが8個の場合 SIMDグループは4つのベクトルに 分割されます データバッファの値は まず2つの インデックスにシャッフルされ フィルデータは8個のスレッドの 各セットにシャッフルされます では これらの新しい命令の 例を見てみましょう 最新のレンダリング画像の エッジ検出に使用されるカーネルを SIMDのシャッフルとフィルを使って 最適化します 最終結果を生成するため 入力画像には5×5の 畳み込みカーネルを適用します 出力画像はSIMDグループの セットに分割されます 各SIMDグループは4×8のチャンクで 各スレッドは1つの出力に書き込みます ここでは 1つのSIMDグループの出力を 生成することを考えましょう 5×5の畳み込みでは 各スレッドが入力から5×5の ピクセルを読み取る必要があります 4×8のSIMDグループの場合は 8×12の領域をコンピュートシェーダで それぞれサンプリングする必要があります この畳み込みのナイーブな実装では 各出力スレッドに25個の サンプリングが必要になります このため SIMDグループ全体で 大幅な重複が生じます これをシャッフル命令と フィル命令で最適化すれば SIMDグループ内の重複する サンプリングを削除し レジスタシャッフルによって データを共有できます では なぜこれらの場所から読み取る 必要があるのかを見てみましょう まずAが読み込まれます これは4×8のウインドウで SIMDグループの各スレッドが 1つのピクセルをサンプリングします 次に 右上のウインドウのB 左下のウインドウのC そして最後に右下のウインドウのDとなります 赤い輪郭の長方形は 出力画像のSIMDグループの デスティネーション領域を示しています スレッドごとに4つのサンプリングを用いて 8×12の入力領域をSIMDグループ全体で 重複することなく読み込みました スレッド0の5×5の領域で見ると これらのサンプリングは5×5の 近傍領域で捉えることができます クアッドのシャッフルとフィルダウンを使って 近傍領域の最初の行にアクセスできます まず Aのデータをシャッフルダウンし Bのデータでフィルします その後 前の行の32幅のベクトルが 次の行にシャッフルダウンされます データが1行分下にシャッフルされるため サンプリングのシャッフルには 32幅のベクトルの 上層レーンのCとDからの フィルベクトルが必要です 同じ方法で SIMDとクアッドの シャッフルダウンを使えば 5×5の領域の残りの サンプリングを取得できます 近傍領域がすべてシャッフルされると 取得したサンプリングは エッジ検出アルゴリズムの 入力として使用されます ナイーブな実装では 各スレッドの近傍領域をすべて サンプリングしていましたが 新しいSIMDとクアッドの シャッフル命令およびフィル命令では 各SIMDグループのサンプリング数が 84%削減され 隣接するスレッド間でのサンプリングの 重複がなくなりました 新しいSIMD演算を活用すれば 一般的な画像処理や 機械学習のアルゴリズムの多くで 同じアプローチを適用して SIMDグループ間の共有データを 最適化できます 以上 SIMDのシャッフルと フィルについてでした 全体の内容を振り返ってみましょう ロッシー圧縮は簡単に実装でき テクスチャの品質を維持しつつ メモリフットプリントと 帯域幅を節約できる機能です スパースデプスとステンシルの テクスチャを使えば 効率的かつ高品質な シャドウマップを作成できます 新しい演算命令の SIMDのシャッフルとフィルは 重複を減らし 機械学習や 画像処理Appにおける スライディングウィンドウの 画像演算を改善します 最後に すべてのMetal Appでは A15 Bionic GPUの 全体的なアーキテクチャの改善により パフォーマンス レスポンス 省電力性が さらに向上しています ご視聴ありがとうございました
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。