search
LoginSignup
3
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

データ指向なんもわからん!(③JobSystemとBurst Compiler編)

前回の記事の続きです。

さて、Unityでデータ指向をあつかうにはDOTSというものを使えばいいそうですね。
DOTSとはなんぞやを調べてるうちにJobSystemとBurst Compilerとはなんぞやっていう壁が先に待ってました。
調べよう。

JobSystem

Unity C# Job System を使用すると、ゲームパフォーマンスを向上させるために、Unity エンジンと相互作用する簡単で安全なマルチスレッドコードを作成できます。
(Unity公式ドキュメントより)

Unityで並列処理を可能にしたよ、ということらしいです。

あれ?今までは違ったの?と思っちゃったんですが、テラシュールブログさんが解説してくださってました。
【Unity】C# Job Systemを自分なりに解説してみる - テラシュールブログ

わたしが勘違いしてたのは、非同期処理のことでした。

そもそも並列処理って?

並列処理は、複数のタスクを順序や実行タイミングを把握せずに、一気に実行する方法です。

たとえば、6msかかるタスクが4つあったとして、その処理を順番に1つのコアが行うと
6[ms] x 4 = 24[ms] かかる計算となります。
image.png

先ほどの処理を、4つのコアで担うとどうなるでしょう。
1つのコアで行われるタスク処理の時間は
6[ms] x 1 = 6[ms] で、それが並列に4つ動くので、合計6msしかかからないですね。
image.png

じゃあ非同期処理って?

非同期処理も複数のスレッドが同時に処理を行うのですが、非同期処理の役割は
入力待ちを最小限にすることです。

通信やファイル読み込みなど、処理に時間がかかるタスクがあるとします。
このタスクを行っている間、CUP1は他の入力を受け付けることが出来ません。

非同期処理はこのタスクを別スレッドに渡して、CPU1が即座に他入力に反応できる状態を作ります。

image.png

つまり

並列処理を使うと、空いたリソースを利用して処理をより早くできるメリットがあるわけですね。

Burst Compiler

C# Job Systemは、Burst Compiler向けに最適化されてるコンパイラです。高速なコードを吐き出してくれるらしい。
バーストコンパイラ・・・!なんだか強そうですね。調べよう。
ちなみにこちらはUnityでのコンパイルの仕組みの図。
今回のBurst Compilerが1番右のやつですね。

image.png

Burst Compilerはなぜ早い?

LLVMの最適化が効くから

LLVMとは、コンパイル時、リンク時、実行時などあらゆる時点でプログラムを最適化するよう設計された、任意のプログラミング言語に対応可能なコンパイラ基盤である

Burst Compilerのすごいところは、ILをCPUに合わせてCPU演算向け最適化を行ったアセンブラを吐いてくれることにあります。
あらかじめ最適化されたアセンブラを実行することになるので、実行時のパフォーマンスがあがります。

SIMDを使うから

SIMDとは、コンピュータやマイクロプロセッサで並列処理を行なうための設計様式の一つで、一つの命令を同時に複数のデータに適用し、並列に処理する方式。 そのような処理方式をベクトル演算、ベクトル処理などと呼ぶことがある。

最近のCPUには1つの命令で複数のデータを同時に計算する命令群が備わっているらしい。
つまり、1命令で4つのfloatの足し算や掛け算を1度に行うことが出来る。

メモリエイリアスを考慮するから

どうやらエイリアス問題といったものが起きたときに、ちゃんとエラーをはいてくれるらしい。
エイリアス問題については、調べてもよくわからなかった。。。おしえて...えらい人...

Burst Compilerの制約

そんなBurst Compilerですが、いくつか制約があります。

C# Job Systemでしか使えない

先ほど書いた通り

C# Job Systemは、Burst Compiler向けに最適化されてるコンパイラです。

言い換えると、Burst CompilerはC# Job System専用のコンパイラというわけです。

クラスが使えない

GCを避けるため、マネージドヒープを使う参照型が使えません。

  • 使える
    • 構造体
    • NativeArray
    • NativeString
  • 使えない
    • クラス
    • 配列
    • 文字列

例外処理が使えない

  • 使える
    • throw
  • 使えない
    • try
    • catch
    • finally

JobSystemとBurst Compiler

JobSystem専用であったり、制約を設けることで、C++と同等の高速化を実現できてるらしい!
これが次回の記事で使おうと思ってるDOTSで威力を発揮するらしいよ!

参照
https://learning.unity3d.jp/3973/
http://i-saint.hatenablog.com/entry/2015/05/26/212441

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
3
Help us understand the problem. What are the problem?