C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜

2.9K Views

October 29, 19

スライド概要

スピーカー: ユニティ・テクノロジーズ・ジャパン 安原祐二・名雪通

profile-image

リアルタイム3Dコンテンツを制作・運用するための世界的にリードするプラットフォームである「Unity」の日本国内における販売、サポート、コミュニティ活動、研究開発、教育支援を行っています。ゲーム開発者からアーティスト、建築家、自動車デザイナー、映画製作者など、さまざまなクリエイターがUnityを使い想像力を発揮しています。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

C#×LLVM = アセンブラ!? 〜詳説・Burstコンパイラー〜 ユニティ・テクノロジーズ・ジャパン 名雪 通 安原祐二

2.

速いプログラムを お願いしまーす! どの言語にする? C# C++ アセンブラ

3.

C#で速い のがいい!

4.

そこで Burstコンパイラー! 速い! すごい! というお話です。

5.

書きたいのはC# C# ??? 実行されるのは機械語 機械語

6.

ふつうの場合 C# C#コンパイラ IL Mono(AOT/JIT) 機械語

7.

IL2CPP登場 C# C#コンパイラ IL IL2CPP C++ すごい! 機械語

8.

IL2CPP登場 C# もっと速く したい! C#コンパイラ IL IL2CPP C++ えー 機械語

9.

Burstコンパイラー 登場 C# C#コンパイラ すごーい IL Burstコンパイラー IR 機械語 LLVM

10.

LLVMとは 様々なプログラミング言語に 対応可能なコンパイラー基盤 Apple, Google, ARMも開発に参加

11.

IRとは LLVMが扱う中間言語 プログラミング言語・CPUアーキテクチャから独立 LLVMはIRを対象に最適化を行う

12.

C# なぜBurstは 速いの? C#コンパイラ IL Burstコンパイラー IR 機械語 LLVM

13.

速い理由 LLVMの最適化 が効く

14.

LLVMの最適化 C++ clang IR llvm すごい 最適化 IR obj

15.

LLVMの最適化 C++ clang IR llvm IR obj IR obj すごい 最適化 C# IL Burst IR llvm すごい 最適化

16.

速い理由 その2 SIMDを使う!

17.

SIMD ( Single Instruction Multiple Data ) とは ひとつの命令で複数の計算を行う仕組み SSE (Intel CPU) NEON (ARM CPU) など

19.

アセンブラ簡易診断 (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

20.

各プラットフォームの対応状況 ターゲットプラットフォーム 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)

21.

速い理由 その3 メモリエイリアス を考慮

22.

memcpy(src, dst, 128); これも ベクタライズ したい!

23.

memcpy(src, dst, 128); ベクタライズ src 3 1 4 1 5 9 dst

24.

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 エイリアス問題

25.

重なったメモリで試してみると・・・ エラーが 出てくれる!

26.

for (var i = 0; i < dst.Length; ++i) { dst[i] = src[i]; } ベクタライズ 成功例

27.

C# C#コンパイラ すごーい IL Burstコンパイラー IR 機械語 LLVM

28.

Burstの制約 C# Job Systemでしか使えない

29.

C# Job System とは Unityエンジンの並列処理システム ワーカースレッドが実行 データ データ プログラム Job ワーカースレッド

30.

Burstの制約 その2 クラスが使えない

31.

マネージドヒープを使う参照型は使えない (ガベージコレクションを避けるため) 使えない 使える クラス 構造体 配列 NativeArray 文字列 NativeString

32.

Burstの制約 その3 例外処理ができない

33.

throwだけは使える 使えない try catch finally 使える throw

34.

C# C#コンパイラ すごーい IL Burstコンパイラー IR 機械語 LLVM

35.

実演パート

36.

https://github.com/tnayuki/Unity-BurstWave

37.

Burstの今後

38.

機種間Deterministic! 本当? 本当

39.

機種間Deterministic 単精度のadd,sub,mul,div,sqrtは保証されている https://randomascii.wordpress.com/2013/07/16/floating-point-determinism/ 原理的には可能

40.

Unity.Burst.Intrinsics 本当? 本当

41.

まとめ IL2CPPは 汎用性が高い代わりに、大幅な高速化は望めなかった Burstは 制約を設けることでC++と同等の高速化 ベクタライズされたコードを出力可能に DOTS(Data-Oriented Technology Stack)で威力を発揮

42.

おしまい