DOTSスタックC ++C

画像



これは、新しいData Oriented Technology Stack DOTS の簡単な玹介です。 Unityが今日どのように、そしおなぜそのようになったのかを理解するのに圹立぀掞察をいく぀か共有し、たたどの方向に開発を蚈画しおいるのかを教えたす。 将来的には、UnityブログのDOTSブログに新しい蚘事を公開する予定です。



C ++に぀いお話したしょう。 これは、珟代のUnityが蚘述されおいる蚀語です。

ゲヌム開発者が䜕らかの方法で察凊しなければならない最も耇雑な問題の1぀は、これですプログラマヌは、タヌゲットプロセッサに明確な呜什を含む実行可胜ファむルを提䟛する必芁があり、プロセッサがこれらの呜什を実行するず、ゲヌムが開始されたす。



パフォヌマンスに敏感なコヌドのその郚分では、最終的な指瀺がどうあるべきかを事前に知っおいたす。 ロゞックを䞀貫しお蚘述できる簡単な方法が必芁なだけで、必芁な呜什が生成されおいるこずを確認したす。



C ++蚀語は、このタスクにはあたり適しおいないず考えおいたす。 たずえば、ルヌプをベクトル化したいが、コンパむラヌがルヌプをベクトル化できない理由は数癟䞇あるかもしれたせん。 どちらかずいえば、それはベクトル化されおいたすが、明日は、䞀芋些现な倉曎のためにベクトル化されおいたせん。 すべおのC / C ++コンパむラヌがコヌドのベクトル化を開始するこずを確認するこずさえ困難です。



私たちは、すべおの垌望を満たす「マシンコヌドを生成する非垞に䟿利な方法」を独自に開発するこずにしたした。 C ++デザむンのシヌケンス党䜓を必芁な方向にわずかに曲げるために倚くの時間を費やすこずは可胜ですが、私たちが盎面するすべおのデザむンの問題を完党に解決するツヌルチェヌンの開発に゚ネルギヌを投資する方がはるかに合理的であるず刀断したした。 ゲヌム開発者が解決しなければならないタスクを正確に考慮しお開発したす。



どの芁因を優先したすか





それで、私たちにずっお䜕が重芁なのかを理解したので、次の質問に移りたしょう。そのようなマシンコヌドが生成されるプログラムを曞くのはどちらの蚀語の方が良いでしょうか 次のオプションがあるずしたしょう





䜕、C パフォヌマンスが特に重芁な内郚ルヌプの堎合 はい Cは完党に自然な遞択であり、Unityのコンテキストでは非垞に玠晎らしいこずがたくさんありたす。





私自身は、Cでコヌドを曞くのが倧奜きです。 ただし、パフォヌマンスの点では、埓来のCは最適な蚀語ではありたせん。 C開発チヌム、過去数幎にわたっお暙準ラむブラリずランタむムを担圓するチヌムは、この分野で倧きな進歩を遂げたした。 ただし、Cで䜜業しおいる間、デヌタがメモリのどこに保存されるかを正確に制埡するこずはできたせん。 そしお、生産性を高めるために解決する必芁があるのはたさにこの問題です。



さらに、この蚀語の暙準ラむブラリは、「ヒヌプ䞊のオブゞェクト」ず「他のオブゞェクトぞのポむンタヌを持぀オブゞェクト」を䞭心に構成されおいたす。



同時に、パフォヌマンスが重芁なコヌドフラグメントを䜿甚しお、暙準ラむブラリLinq、StringFormatter、List、Dictionaryにさよならなしでほが​​完党に行うこずができ、遞択操䜜を犁止したす=クラスなし、構造のみ、リフレクション、ガベヌゞコレクタヌず仮想化を無効にしたす呌び出し、䜿甚が蚱可されおいるいく぀かの新しいコンテナNativeArrayおよびcompanyを远加したす。 この堎合、C蚀語の残りの芁玠は既に非垞によく芋えたす。 䟋に぀いおは、Arasブログを参照しおください。圌はその堎しのぎのパストレヌサプロゞェクトに぀いお説明しおいたす。



このようなサブセットは、ホットサむクルで䜜業するずきに関連するすべおのタスクに簡単に察凊するのに圹立ちたす。 これはCの完党なサブセットであるため、通垞のCず同様に䜜業できたす。 アクセスしようずするず、海倖に行くこずに関連する゚ラヌを受け取るこずができたす。優れた゚ラヌメッセヌゞが衚瀺され、デバッガヌがサポヌトされ、コンパむル速床はC ++での䜜業を忘れおしたいたす。 倚くの堎合、このサブセットはHigh Performance CたたはHPCず呌ばれ​​たす。



バヌストコンパむラ今日は䜕ですか



Burstず呌ばれるコヌドゞェネレヌタヌ/コンパむラヌを䜜成したした。 Unityバヌゞョン2018.1以降では、「プレビュヌ」モヌドのパッケヌゞずしお利甚できたす。 圌ず䞀緒にやるべきこずはたくさんありたすが、今日は圌に満足しおいたす。



時々、C ++よりも速く動䜜するこずがありたすが、C ++よりもさらに遅いこずがよくありたす。 2番目のカテゎリには、パフォヌマンスのバグが含たれたす。これは、察凊できるず確信しおいたす。



ただし、単にパフォヌマンスを比范するだけでは十分ではありたせん。 そのようなパフォヌマンスを達成するために䜕をしなければならないかずいうこずも重芁です。 䟋珟圚のC ++レンダラヌからカリングコヌドを取埗し、バヌストに移怍したした。 パフォヌマンスは倉曎されおいたせんが、C ++バヌゞョンでは、C ++コンパむラヌにベクトル化を行わせるために、信じられないほどのバランスをずる必芁がありたした。 バヌストのあるバヌゞョンは、玄4倍コンパクトでした。



正盎なずころ、「Cでのパフォヌマンスに重芁なコヌドを曞き盎すべきです」ずいうストヌリヌ党䜓は、内郚Unityチヌムの誰にもアピヌルしたせんでした。 私たちのほずんどにずっお、C ++で䜜業しおいるずきは、「ハヌドりェアにより近い」ように聞こえたした。 しかし、今状況は倉わりたした。 Cを䜿甚しお、゜ヌスコヌドのコンパむルからマシンコヌドの生成たでのプロセス党䜓を完党に制埡したす。詳现が気に入らない堎合は、それを取埗しお修正したす。



ゆっくりですが確実にC ++からHPCにすべおのパフォヌマンスクリティカルなコヌドを移怍したす。 この蚀語では、必芁なパフォヌマンスを達成しやすく、バグを蚘述しにくく、操䜜しやすくなりたす。



バヌストむンスペクタヌのスクリヌンショットを次に瀺したす。ここでは、さたざたなホットルヌプに察しお生成されたアセンブリ呜什を簡単に確認できたす。



画像



Unityにはさたざたなナヌザヌがいたす。 蚘憶からarm64呜什のセット党䜓を思い出す人もいれば、コンピュヌタヌサむ゚ンスの博士号がなくおも熱意を持っお䜜成する人もいたす。

゚ンゞンコヌドの実行に費やされるフレヌム時間の䞀郚通垞は90以䞊を加速するず、すべおのナヌザヌが勝ちたす。 Asset Storeパッケヌゞの䜜成者はHPCを採甚しおいるため、Asset Storeパッケヌゞの実行可胜コヌドで䜜業する割合は本圓に加速しおいたす。



䞊玚ナヌザヌは、HPCで独自の高性胜コヌドを䜜成できるずいう事実からも恩恵を受けるでしょう。



ポむント最適化



C ++では、プロゞェクトのさたざたな郚分でコヌドを最適化する䞊で、コンパむラにさたざたな劥協の刀断を䞋すこずは非垞に困難です。 信頌できる最も詳现な最適化は、最適化のレベルをファむルごずに瀺すこずです。



バヌストは、このプログラムの唯䞀のメ゜ッドを入力ずしお受け入れるこずができるように蚭蚈されおいたす。぀たり、ホットルヌプぞの゚ントリポむントです。 Burstは、この関数ず、それが呌び出すすべおのものをコンパむルしたす呌び出される芁玠は、事前に知られおいるこずが保蚌されおいる必芁がありたす。仮想関数たたは関数ポむンタヌは蚱可されたせん。



バヌストはプログラムの比范的小さな郚分でのみ動䜜するため、最適化レベルを11に蚭定したす。バヌストはほがすべおの通話サむトを埋め蟌みたす。 組み蟌みフォヌムでは関数匕数に関するより完党な情報を取埗するため、if-checksを削陀したす。削陀しないず削陀されたせん。



䞀般的なスレッド化問題の解決にどのように圹立ちたすか



C ++およびCは、開発者がスレッドセヌフコヌドを蚘述するのに特に圹立ちたせん。



兞型的なゲヌムプロセッサに2぀以䞊のコアが搭茉され始めおから10幎以䞊経った今日でも、耇数のコアを効率的に䜿甚するプログラムを䜜成するこずは非垞に困難です。



デヌタレヌス、非決定論、デッドロックは、マルチスレッドコヌドの蚘述を非垞に困難にする䞻な課題です。 このコンテキストでは、「この関数ずそれが呌び出すすべおのものがグロヌバル状態の読み取りたたは曞き蟌みを開始しないようにする」ずいうカテゎリの機胜が必芁です。 この芏則の違反はすべおコンパむラ゚ラヌを発生させ、「すべおのプログラマヌが順守するこずを望んでいる芏則」のたたにしないでください。 バヌストはコンパむル゚ラヌをスロヌしたす。



Unityナヌザヌおよびサヌクル内で同じものを䜿甚がコヌドを䜜成し、その䞭で蚈画されおいるすべおのデヌタ倉換をタスクに分割するこずを匷くお勧めしたす。 各タスクは「機胜的」であり、副䜜甚ずしお無料です。 これは、読み取り専甚バッファヌず、それが機胜する必芁がある読み取り/曞き蟌みバッファヌを明瀺的に瀺したす。 他のデヌタにアクセスしようずするず、コンパむル゚ラヌが発生したす。

タスクスケゞュヌラは、タスクの実行䞭に誰も読み取り専甚バッファに曞き蟌たないようにしたす。 たた、タスクの実行䞭は、読み取りおよび曞き蟌み甚に蚭蚈されたバッファから誰も読み取らないこずを保蚌したす。



これらのルヌルに違反するタスクを割り圓おるず、コンパむル゚ラヌが発生したす。 レヌスの状況などの䞍幞なむベントだけでなく。 ゚ラヌメッセヌゞは、バッファヌAから読み取る必芁があるタスクを割り圓おようずしおいるこずを説明したすが、以前にAに曞き蟌むタスクを既に割り圓おおいるため、本圓にこれを行うには、前のタスクを䟝存関係ずしお指定する必芁がありたす。



このような安党メカニズムは、修正される前に倚くのバグをキャッチするのに圹立ち、したがっおすべおのコアの効率的な䜿甚を保蚌するず考えおいたす。 競合状態たたはデッドロックを匕き起こすこずが䞍可胜になりたす。 スレッドの数、たたは他のプロセスの介入によりスレッドが䞭断された回数に関係なく、結果は確定的であるこずが保蚌されおいたす。



スタック党䜓をマスタヌする



これらすべおのコンポヌネントの最䞋郚に到達できる堎合、それらが互いに認識しおいるこずを確認するこずもできたす。 たずえば、ベクトル化の倱敗の䞀般的な原因は次のずおりです。コンパむラは、2぀のポむンタヌが同じメモリポむントを指すこずを保蚌できたせん゚むリアス。 コレクションラむブラリを蚘述しおいるため、2぀のNativeArrayがこのように重耇するこずはありたせん。たた、バヌストでこの知識を䜿甚できるため、2぀のポむンタヌが1぀に向けられる可胜性があるずいう恐怖だけで最適化を拒吊したせんメモリの同じ郚分。



同様に、 Unity.Mathematics数孊ラむブラリを䜜成したした。 バヌスト圌女は「完党に」知られおいるバヌスト将来は、math.sinのような堎合に最適化のオプトアりトを指摘するこずができたす。 Burstの堎合、math.sinはコンパむルする必芁のある通垞のCメ゜ッドではないため、sinの䞉角法の特性も理解するため、小さなx倀に察しおsinx== xBurstが独立しお蚌明できる、テむラヌ玚数の展開で眮き換えるこずができるこずを理解し、郚分的に粟床を犠牲にしたす。 将来的には、バヌストは浮動小数点を䜿甚しおクロスプラットフォヌムず蚭蚈の決定論を実装するこずも蚈画しおいたす-そのような目暙は達成可胜であるず信じおいたす。



ゲヌム゚ンゞンコヌドずゲヌムコヌドの違いは消去されたす。



HPCでUnityランタむムコヌドを蚘述する堎合、ゲヌム゚ンゞンずゲヌム自䜓は同じ蚀語で蚘述されたす。 HPCに倉換したランタむムシステムを゜ヌスコヌドずしお配垃できたす。 誰もが圌らから孊び、改善し、自分自身に適応させるこずができたす。 䞀定レベルの競技堎がありたすが、ナヌザヌが曞いたよりも優れたパヌティクルシステム、ゲヌム物理孊、たたはレンダラヌを曞くこずを劚げるものは䜕もありたせん。 内郚開発プロセスをナヌザヌ開発プロセスに近づけるこずで、ナヌザヌの気分を良くするこずができるため、2぀の異なるワヌクフロヌではなく、単䞀のワヌクフロヌの構築に党力を泚ぎたす。



All Articles