2.9K Views
October 29, 19
スライド概要
スピーカー: ユニティ・テクノロジーズ・ジャパン 安原祐二・名雪通
リアルタイム3Dコンテンツを制作・運用するための世界的にリードするプラットフォームである「Unity」の日本国内における販売、サポート、コミュニティ活動、研究開発、教育支援を行っています。ゲーム開発者からアーティスト、建築家、自動車デザイナー、映画製作者など、さまざまなクリエイターがUnityを使い想像力を発揮しています。
C#×LLVM = アセンブラ!? 〜詳説・Burstコンパイラー〜 ユニティ・テクノロジーズ・ジャパン 名雪 通 安原祐二
速いプログラムを お願いしまーす! どの言語にする? C# C++ アセンブラ
C#で速い のがいい!
そこで Burstコンパイラー! 速い! すごい! というお話です。
書きたいのはC# C# ??? 実行されるのは機械語 機械語
ふつうの場合 C# C#コンパイラ IL Mono(AOT/JIT) 機械語
IL2CPP登場 C# C#コンパイラ IL IL2CPP C++ すごい! 機械語
IL2CPP登場 C# もっと速く したい! C#コンパイラ IL IL2CPP C++ えー 機械語
Burstコンパイラー 登場 C# C#コンパイラ すごーい IL Burstコンパイラー IR 機械語 LLVM
LLVMとは 様々なプログラミング言語に 対応可能なコンパイラー基盤 Apple, Google, ARMも開発に参加
IRとは LLVMが扱う中間言語 プログラミング言語・CPUアーキテクチャから独立 LLVMはIRを対象に最適化を行う
C# なぜBurstは 速いの? C#コンパイラ IL Burstコンパイラー IR 機械語 LLVM
速い理由 LLVMの最適化 が効く
LLVMの最適化 C++ clang IR llvm すごい 最適化 IR obj
LLVMの最適化 C++ clang IR llvm IR obj IR obj すごい 最適化 C# IL Burst IR llvm すごい 最適化
速い理由 その2 SIMDを使う!
SIMD ( Single Instruction Multiple Data ) とは ひとつの命令で複数の計算を行う仕組み SSE (Intel CPU) NEON (ARM CPU) など
アセンブラ簡易診断 (intel) ???ss →ベクトル演算になっていない mulss addss subss xmm5, xmm2 xmm4, xmm4 xmm4, dword ptr [rdi + 4*rdx] ???ps →ベクトル演算になっている mulps subps addps xmm2, xmm10 xmm2, xmm1 xmm2, xmm0
各プラットフォームの対応状況 ターゲットプラットフォーム Windows Universal Windows Platform Android Xbox One PS4 macOS iOS Android Linux サポートしているCPUアーキテクチャ x86 (SSE2, SSE4),x64 (SSE2, SSE4) x86 (SSE2, SSE4),x64 (SSE2, SSE4), ARM32 Thumb2/Neon32,ARMV8 AARCH64 x86 SSE2,ARM32 Thumb2/Neon32,ARMV8, AARCH64 x64 SSE4 x64 SSE4 x86 (SSE2, SSE4),x64 (SSE2, SSE4) ARM32 Thumb2/Neon32,ARMV8 AARCH64 x86 SSE2,ARM32 Thumb2/Neon32,ARMV8, AARCH64 x86 (SSE2, SSE4),x64 (SSE2, SSE4)
速い理由 その3 メモリエイリアス を考慮
memcpy(src, dst, 128); これも ベクタライズ したい!
memcpy(src, dst, 128); ベクタライズ src 3 1 4 1 5 9 dst
memcpy(src, dst, 128); ベクタライズ src 3 1 4 1 5 9 dst dstが重なってる可能性 src dst 3 1 4 1 5 9 dst 事故発生! 1 4 1 5 9 エイリアス問題
重なったメモリで試してみると・・・ エラーが 出てくれる!
for (var i = 0; i < dst.Length; ++i) { dst[i] = src[i]; } ベクタライズ 成功例
C# C#コンパイラ すごーい IL Burstコンパイラー IR 機械語 LLVM
Burstの制約 C# Job Systemでしか使えない
C# Job System とは Unityエンジンの並列処理システム ワーカースレッドが実行 データ データ プログラム Job ワーカースレッド
Burstの制約 その2 クラスが使えない
マネージドヒープを使う参照型は使えない (ガベージコレクションを避けるため) 使えない 使える クラス 構造体 配列 NativeArray 文字列 NativeString
Burstの制約 その3 例外処理ができない
throwだけは使える 使えない try catch finally 使える throw
C# C#コンパイラ すごーい IL Burstコンパイラー IR 機械語 LLVM
実演パート
https://github.com/tnayuki/Unity-BurstWave
Burstの今後
機種間Deterministic! 本当? 本当
機種間Deterministic 単精度のadd,sub,mul,div,sqrtは保証されている https://randomascii.wordpress.com/2013/07/16/floating-point-determinism/ 原理的には可能
Unity.Burst.Intrinsics 本当? 本当
まとめ IL2CPPは 汎用性が高い代わりに、大幅な高速化は望めなかった Burstは 制約を設けることでC++と同等の高速化 ベクタライズされたコードを出力可能に DOTS(Data-Oriented Technology Stack)で威力を発揮
おしまい