C#JobSystem_Intel

Similar documents

Insert your Title here

Microsoft PowerPoint - 03_What is OpenMP 4.0 other_Jan18

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

1_cover

Week 1 理解度確認クイズ解答 解説 問題 1 (4 2 点 =8 点 ) 以下の各問いに答えよ 問題 bit 版の Windows8.1 に Java をインストールする時 必要なパッケージはどれか 但し Java のコンパイルができる環境をインストールするものとする 1. jdk

Microsoft PowerPoint ppt

PowerPoint プレゼンテーション

デジタル表現論・第6回

Unite2016Tokyo-yasuhara.key

POSIXスレッド

1

Slide 1

Seasar.NET入門

Java の ConcurrentHashMap における同期化 バッドケースとその対処法 2013 年 9 月湊隆行 1. はじめに表 1.1 に示すように Java の Collections Framework には 3 つの世代があります バージョン 1.0 から存在するレガシー API バ

C#の基本2 ~プログラムの制御構造~

注意事項 このアセットを利用する前に以下の点にご注意下さい ビルドのターゲットとなるプラットフォームは Windows だけとなります アセットの特徴 Unity5 の場合 Personal Edtion Professional Edition のどちらでも利用できます どちらの Edition

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

Slide 1

Microsoft PowerPoint - prog03.ppt

memo

Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx

PowerPoint プレゼンテーション

Microsoft PowerPoint - ca ppt [互換モード]

2016 VOCALOID Group, Yamaha Corporation 2

デジタル表現論・第4回

memo

Microsoft PowerPoint - handout07.ppt [互換モード]

intra-mart Accel Platform — IM-Repository拡張プログラミングガイド   初版  

About me! 足立昌彦 / +Masahiko.Adachi )! バイドゥ株式会社技術顧問 (Simeji)! 株式会社カブク Co-Founder! Google Developer Expert (Android)

Microsoft PowerPoint pptx

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

適応フィルタのSIMD最適化


しずおかアプリ部 Unity はじめるよ すごいよサウンド機能 実践編 統合開発環境を内蔵したゲームエンジン いろんな職業の が る資料なので説明を簡単にしてある部分があります 正確には本来の意味と違いますが上記理由のためです ご了承ください この

CUDA を用いた画像処理 画像処理を CUDA で並列化 基本的な並列化の考え方 目標 : 妥当な Naïve コードが書ける 最適化の初歩がわかる ブロックサイズ メモリアクセスパターン

Microsoft Word - C言語研修 C++編 3.doc

COMET II のプログラミング ここでは機械語レベルプログラミングを学びます 1

SuperH RISC engineファミリ用 C/C++コンパイラパッケージ V.7~V.9 ご使用上のお願い

Microsoft PowerPoint - C++_第1回.pptx

<4D F736F F D2091E63589F182628CBE8CEA8D758DC08E9197BF2E646F6378>

02: 変数と標準入出力

スライド 1

メソッドのまとめ

JAVA入門


02: 変数と標準入出力

プログラミング実習I

memo

システム操作インターフェイス最適化によるテスト自動化ROI向上

修士論文

Java知識テスト問題

2 ColorSpace DepthSpace CameraSpace Kinect V2 Kinect V2 BOdyIndex 3. NtKinect Kinect V2 C++ NtKinect [4] NtKinect = Kinect SDK + + STL(C++) + OpenCV +

NetworkVantage 9

ex04_2012.ppt

7th CodeGear Developer Camp

Microsoft Word - CompA-Ex doc

スライド 1

PowerPoint プレゼンテーション

Prog2_10th

2016 年度 JAVA 講座第六週目 目次 パッケージ... 2 パッケージの作成... 2 パッケージの使用方法... 3 異なるパッケージ同名クラスの宣言... 4 パッケージの側面から見たアクセス修飾子... 4 ラッパークラス... 5 ラッパークラス利用法:キャスト... 5 ラッパーク

P (表1表4).ai

情報工学実験 C コンパイラ第 2 回説明資料 (2017 年度 ) 担当 : 笹倉 佐藤

Prog2_9th


DEMO1 まずはやってみよう アクティビティをダブルクリック 作成 - プロジェクト C# => Workflow CodeActivity をぽとぺ シーケンシャルと ステートマシン それぞれのコ ンソールアプリ あとライブラリがある びっくりマークは足りていないあかし プロパティをみると判別で

Microsoft PowerPoint - 第3回目.ppt [互換モード]

Java講座

PowerPoint プレゼンテーション

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

とても使いやすい Boost の serialization

Secure iNetSuite for .NET 4.0Jの新仕様について

Microsoft PowerPoint - 04.pptx

5th CodeGear Developer Camp [A5]

AquesTalk プログラミングガイド

PowerPoint Presentation

第 2 章インタフェース定義言語 (IDL) IDL とは 言語や OS に依存しないインタフェース定義を行うためのインタフェース定義言語です CORBA アプリケーションを作成する場合は インタフェースを定義した IDL ファイルを作成する必要があります ここでは IDL の文法や IDL ファイ

セゾン保険_PDF用.indd

プログラミング入門1

Undestand の解析 Understand の C 言語で抽出できない依存関係について サンプルコードを用いて説明します 確認バージョン Understand 3.0 (Build 640) Understand 3.1 (Build 700) Understand 4.0 (Build 78

C#の基本

untitled

Prog2_10th

学校では教えてくれないアセットバンドル

< F2D834F838C A815B A CC>

Microsoft PowerPoint ppt

Microsoft PowerPoint - 12.ppt [互換モード]

PowerPoint プレゼンテーション

6-1

Microsoft PowerPoint - kougi9.ppt

日本アンドロイドの会 四国支部 Kickoff ミーティング in ABC2009

IT プロジェクト

第 3 回 Java 講座 今回の内容 今週の Java 講座はコレクション 拡張 for 文, ガベージコレクションについて扱う. 今週の Java 講座は一番内容が薄いも のになるだろう. コレクション コレクションとは大きさが決まっていない配列だと考えればよい. コレクションには List 先

Developer Camp

ただし 無作為にスレッドを複数実行すると 結果不正やデッドロックが起きる可能性がある 複数のスレッド ( マルチスレッド ) を安全に実行する ( スレッドセーフにする ) ためには 同期処理を用いるこ とが必要になる 同期処理は 予約語 synchronized で行うことができる ここでは sy

Functional Programming

微分方程式 モデリングとシミュレーション

Transcription:

Unity のマルチスレッドプログラミング ユニティ テクノロジーズ ジャパン合同会社 エバンジェリスト 伊藤周

諸注意 今回紹介するC# Job Systemはまだ発展段階 リリースでは多少の差異が出る可能性がある C# Job Systemの概念を知ってほしい プログラマ以外は理解不能

アジェンダ 従来のマルチスレッドプログラミング C# Job System の概要 Let s read codes. ( コードを読む ) Let s make a mistake. ( 間違ってみる ) Let s try C# Job Compiler ( コンパイラを体験 ) Let s implement. ( 実装してみる ) まとめ

従来のマルチスレッドプログラミングの話

MTP のここが嫌だその 1 レースコンディション対策が嫌だ 面倒臭い A write A コードが汚い 可読性が低い 間違っても気づきにくい? B write A B read A

MTP のここが嫌だその 2 デッドロックが嫌だ 面倒臭い コードが汚い 可読性が低い 間違うと無限ループ B 待ち 待ち A B A

MTP のここが嫌だその 3 難解なところが嫌だ mutex:lock とか アトミック変数とか

MTP のここが嫌だその 4 デバッグが嫌だ 正常に 動いてしまったり する 無限ループになったりする 突然ハングアップしたりする リリース後にバグが判明したりする

C# Job System の概要

116

116 Boid シミュレーションをマルチスレッドで 8 core CPU で動かした場合の速度倍

Demo

C# Job System の特徴 簡潔に書ける GCフリー 安全 高速な新コンパイラ

特徴 1 簡潔に書ける Data Oriented Programming データとビヘイビア ( 振舞い ) の分離 struct( 構造体 ) コンポーネントの導入 Job Component System の用意 簡潔に書けるようにマネージャーを用意

特徴 2 GC フリー GCをいかにさせないか NativeArrayの導入 以下の感じで確保 var src = new NativeArray<float>(500, Allocator.Temp); 以下の感じで解放 ( 自分で ) src.dispose(); 要素数アロケーターの種類

特徴 2 GC フリー 他の NativeArray ファミリー struct NativeArray<Value> // struct NativeList<Value> // struct NativeSlice<Value> // struct NativeHashmap<Key, Value> // Dictionary struct NativeMultiHashmap<Key, Value> // Dictionary

特徴 3 安全 エラーで指摘してくれる 落ちることはない レースコンディション デッドロックは起こり得ない Sandbox

特徴 4 高速な新コンパイラ C# [Mono] IL [C# Job Compiler] 内部的な Domain Model [ 最適化 ] [LLVM] 実行形式 10 倍 20 倍高速になる 電池消費の軽減 Why faster? SIMD 命令の有効利用 正確さとパフォーマンスのトレードオフ

Let s read C# Job System codes!

コーディング基本まとめ IJob~ でジョブを定義 Execute にジョブの中身を書く Schedule でジョブを開始 Complete でジョブ終了確認 変数はNativeArray 系を使い 自力でDispose

コーディング基本まとめ IJob 1つのスレッドでジョブを回す public void Execute() IJobParallelFor 複数のスレッドでジョブを回す public void Execute(int i) IJobParallelForTransform Transformにアクセスが可能 public void Execute(int i, TransformAccess transform)

Let s make a mistake!

エラーまとめ マルチスレッドプログラミングは間違えやすい ちょっとした見落としはしてしまう Unityは落ちることなくエラーが教えてくれる CTO Joachim Unityは Sandbox(= 砂場 ) である 砂場では間違っていい 正解に導いてくれれれば

Let s try C# Job コンパイラ

C# Job Compiler 一文付け足すだけ [ComputeJobOptimizationAttribute(Accuracy.Med, Support.Relaxed)] Accuracy は計算の精度 新しいmathライブラリ

新 math ライブラリ float1, float2, float3, float4, half1, half2, half3, half4 int1, int2, int3, int4 math.abs math.min math.max math.pow math.lerp math.clamp math.saturate math.select // 条件分岐 math.rcp // 逆数 math.sign math.rsqrt // sqrtの逆数 math.any math.all math.sincos

Let s implement C# Job System.

public class RotatorOldUpdate : MonoBehaviour [SerializeField] float m_speed; public float speed get return m_speed; set m_speed = value; void Update () transform.rotation = transform.rotation * Quaternion.AngleAxis (m_speed * Time.deltaTime, Vector3.up);

Job Component System 実装まとめ STEP1: データレイアウトの最適化 GameObjectごとにするのはやめる データをシーケンシャルにする キャッシュ化する forループでgetcomponentとかしなくてよくなる

public class RotatorOldUpdate : MonoBehaviour [SerializeField] float m_speed; public float speed get return m_speed; set m_speed = value; void Update () transform.rotation = transform.rotation * Quaternion.AngleAxis (m_speed * Time.deltaTime, Vector3.up);

class RotatorManagerMainThread : ScriptBehaviourManager List<Transform> m_transforms; NativeList<float> m_speeds; : protected override void OnUpdate() base.onupdate (); float deltatime = Time.deltaTime; NativeArray<float> speeds = m_speeds; for (int i = 0; i!= m_transforms.count; i++) var transform = m_transforms [i]; transform.rotation = transform.rotation * Quaternion.AngleAxis (speeds[i] * deltatime, Vector3.up); : : public class RotatorWithManagerMainThread : ScriptBehaviour : ( ) :

Job Component System 実装まとめ STEP2: Job 化 List<Transform> TransformAccessArray IJobParallelForTransform 継承したジョブ Execute(int index, TransformAccess transform) の実装

class RotatorManagerMainThread : ScriptBehaviourManager List<Transform> m_transforms; NativeList<float> m_speeds; : protected override void OnUpdate() base.onupdate (); float deltatime = Time.deltaTime; NativeArray<float> speeds = m_speeds; for (int i = 0; i!= m_transforms.count; i++) var transform = m_transforms [i]; transform.rotation = transform.rotation * Quaternion.AngleAxis (speeds[i] * deltatime, Vector3.up); : : public class RotatorWithManagerMainThread : ScriptBehaviour : ( ) :

class RotatorManager : ScriptBehaviourManager TransformAccessArray m_transforms; NativeList<float> m_speeds; JobHandle m_job; : protected override void OnUpdate() base.onupdate (); m_job.complete (); var jobdata = new RotatorJob(); jobdata.speeds = m_speeds; jobdata.deltatime = Time.deltaTime; m_job = jobdata.schedule (m_transforms); struct RotatorJob : IJobParallelForTransform [ReadOnly] public NativeArray<float> speeds; public float deltatime; public void Execute(int index, TransformAccess transform) transform.rotation = transform.rotation * Quaternion.AngleAxis (speeds[index] * deltatime, Vector3.up); public class RotatorWithManager : ScriptBehaviour : ( ) :

Job Component System 実装まとめ STEP3: データからビヘイビアを分離する ジョブで使用するデータを分離する InjectTuplesの導入 Tuples が付加した配列はindexが同期する ComponentSystemから継承させる マネージャーの仕事を任せる

public class RotationSpeedComponent : ScriptBehaviour public float speed; public class RotatingSystem : ComponentSystem [InjectTuples] public ComponentArray<Transform> [InjectTuples] public ComponentArray<RotationSpeedComponent> m_transforms; m_rotators; override protected void OnUpdate() base.onupdate (); float dt = Time.deltaTime; for (int i = 0; i!= m_transforms.length ;i++) m_transforms[i].rotation = m_transforms[i].rotation * Quaternion.AngleAxis(dt * m_rotators[i].speed, Vector3.up);

Job Component System 実装まとめ STEP4: データのstruct 化 MonoBehaviour 継承 IComponentData 継承 struct 化 ComponentSystemからの継承でお手軽マネージャー ComponentArray ComponentDataArray

public class RotationSpeedComponent : ScriptBehaviour public float speed; public class RotatingSystem : ComponentSystem [InjectTuples] public ComponentArray<Transform> [InjectTuples] public ComponentArray<RotationSpeedComponent> m_transforms; m_rotators; override protected void OnUpdate() base.onupdate (); float dt = Time.deltaTime; for (int i = 0; i!= m_transforms.length ;i++) m_transforms[i].rotation = m_transforms[i].rotation * Quaternion.AngleAxis(dt * m_rotators[i].speed, Vector3.up);

[Serializable] public struct RotationSpeed : IComponentData public float speed; public RotationSpeed (float speed) this.speed = speed; public class RotationSpeedDataComponent : ComponentDataWrapper<RotationSpeed> public class RotatingDataSystem : ComponentSystem [InjectTuples] public ComponentArray<Transform> m_transforms; [InjectTuples] public ComponentDataArray<RotationSpeed> m_rotators; override protected void OnUpdate() base.onupdate (); float dt = Time.deltaTime; for (int i = 0; i!= m_transforms.length ;i++) m_transforms[i].rotation = m_transforms[i].rotation * Quaternion.AngleAxis(dt * m_rotators[i].speed, Vector3.up);

Job Component System 実装まとめ STEP5: ジョブ実装と依存性解決 IJobParallelForTransformを継承したstruct Execute で Transformが使える ComponentSystem JobComponentSystem GetDependency() で依存性の自動解決

[Serializable] public struct RotationSpeed : IComponentData public float speed; public RotationSpeed (float speed) this.speed = speed; public class RotationSpeedDataComponent : ComponentDataWrapper<RotationSpeed> public class RotatingDataSystem : ComponentSystem [InjectTuples] public ComponentArray<Transform> m_transforms; [InjectTuples] public ComponentDataArray<RotationSpeed> m_rotators; override protected void OnUpdate() base.onupdate (); float dt = Time.deltaTime; for (int i = 0; i!= m_transforms.length ;i++) m_transforms[i].rotation = m_transforms[i].rotation * Quaternion.AngleAxis(dt * m_rotators[i].speed, Vector3.up);

[Serializable] public struct RotationSpeed : IComponentData public float speed; public RotationSpeed (float speed) this.speed = speed; public class RotationSpeedDataComponent : ComponentDataWrapper<RotationSpeed> public class SystemRotator : JobComponentSystem [InjectTuples] public TransformAccessArray m_transforms; [InjectTuples] public ComponentDataArray<RotationSpeed> m_rotators; override protected void OnUpdate() base.onupdate (); var job = new Job(); job.dt = Time.deltaTime; job.rotators = m_rotators; AddDependency(job.Schedule(m_Transforms, GetDependency ())); struct Job : IJobParallelForTransform public float dt; [ReadOnly] public ComponentDataArray<RotationSpeed> rotators; public void Execute(int i, TransformAccess transform) transform.rotation = transform.rotation * Quaternion.AngleAxis(dt * rotators[i].speed, Vector3.up);

C# Job System 注意点 & まとめ

C# Job System 注意点 データ構造はstructのみ (class はNG).NETやUnity のAPIはジョブ内では ( 基本的に ) 使えない 何でもかんでも早くなるわけではない 算術系が早くなる と考えるのが正解 相互の距離の計算とか 敵 AIの思考ルーチンとか

リリース予定 STEP1 C# Job system Unity 2017.3 or 2018.X STEP2 Component system STEP3 math library STEP4 C# Job Compiler

C# Job System まとめ マルチスレッドプログラミングが安全に書ける 新しい Component System で簡潔に書ける コンパイラをかければさらに早くなる

Q&A