2018年11月13日火曜日

NativeQueue の Defer な Job を作れないかな

NativeQueue の Defer な Schedule() があるとうれしんだけど、なさそう
つくれないかな

Job の作り方
https://jacksondunstan.com/articles/4857
https://github.com/Unity-Technologies/UnityCsReference/blob/54dd67f09e090b1ad5ba1f55886f327106406b0c/Runtime/Jobs/Managed/IJobParallelFor.cs
https://docs.unity3d.com/2018.3/Documentation/ScriptReference/Unity.Jobs.LowLevel.Unsafe.JobsUtility.html

じょぶは、おおまかにこんな感じでつくるっぽい
・基本となるインターフェースの定義( IJobXxx とかいうやつ)
・JobScheduleParameters と、ジョブの Execute() を実行しつづける関数の準備
・そいつを JobsUtility.ScheduleXxx() 系の関数に渡して、スケジュールしてやる


ユーザーがこさえるジョブのひな型たるインターフェースの定義は、こんな感じ
    [JobProducerType(typeof(IJobParallelForExtensions.ParallelForJobStruct < >))]
    public interface IJobParallelFor
    {
        void Execute(int index);
    }

JobScheduleParameters の準備として重要なのは、ReflectionData をセットすること
で、ReflectionData ってのは、JobsUtility.CreateJobReflectionData() で作成するみたい
その時、ジョブを制御するメソッドを渡してやる(ExecuteJobFunction みたいなデリゲートを定義してそいつにキャストして渡してるもよう)

そのジョブ制御メソッドの中では、基本てきにはループで「ユーザーがこさえたジョブ」の Execute() を実行し続けるんだけど、JobsUtility.GetWorkStealingRange() なるもので中断/終了判定をとっているみたいな気配


…と、そんな感じでじょぶ自体は作れそうなかんじなんだけど、肝心のスケジュールが
JobsUtility.Schedule()
JobsUtility.ScheduleParallelFor()
JobsUtility.ScheduleParallelForDeferArraySize() ←これが個数を後回しにできるやつ
JobsUtility.ScheduleParallelForTransform()
くらいしかない
そのうえ個数遅延は NativeList に対して行うものしか用意されていないっぽい

そういうわけで、なんか目論見は無理そう
あと残された手は NativeList 互換的なコンテナ(個数遅延に渡せるもの)の作成なんだけど、なんか難しそうでヤダな…
そういえば、IJobProcessComponent なんとかってのもあったな、あれもソースみてみるか

追記:キューの内部ブロックかスレッドIDに関する情報を詰めた NativeList を軽く作って Defer に渡し、それをもとにデキューしていく…みたいのってできないかな(やる気はない)

0 件のコメント:

コメントを投稿

ニューラルネットやってみてる

最近ニューラルネットやってみてる 理屈を学ぼうと思って、まずはオブジェクト的に作ってみてる (ベクトル化とかは後回しで) sigmoid, tanh, ReLU MSE, cross entorpy あたりを小規模にいじってみてます でも今 soft max の逆伝...