コード例 #1
0
    // Start is called before the first frame update
    void Start()
    {
        SimpleJob simpleJob = new SimpleJob
        {
            number = myNumber,
            data   = myData,
        };

        ParallelJob parallelJob = new ParallelJob
        {
            number = myNumber,
            data   = myData,
        };

        TransformJob transformJob = new TransformJob
        {
            number    = myNumber,
            data      = myData,
            deltaTime = Time.deltaTime,
        };

        simpleJobHandle    = simpleJob.Schedule();
        parallelJobHandle  = parallelJob.Schedule(myData.Length, 32, simpleJobHandle);
        transformJobHandle = transformJob.Schedule(transformAccessArray, parallelJobHandle);

        // dependency like a->b->c...

        JobHandle.ScheduleBatchedJobs();

        simpleJobHandle.Complete();
        parallelJobHandle.Complete();
        transformJobHandle.Complete();

        if (simpleJobHandle.IsCompleted)
        {
            Debug.Log("simple job result " + simpleJob.data[0]);
        }

        if (parallelJobHandle.IsCompleted)
        {
            for (int i = 0; i < myData.Length; ++i)
            {
                Debug.Log("parallel job result " + parallelJob.data[i]);
            }
        }
        myData.Dispose();
        transformAccessArray.Dispose();
    }
コード例 #2
0
    public void FindPrimesInAGeneratedSample()
    {
        results.text = ("\n Starting...");
        //start a stopper to benchmark
        System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
        sw.Start();

        NativeArray <int> input = new NativeArray <int>(inputSize, Allocator.TempJob);
        //store data how many prime numbers we found -> make an array element for each thread to avoid racing (multiple threads trying to write the same element can cause trouble)
        NativeArray <int> numberOfFoundPrimes = new NativeArray <int>(numberOfThreads, Allocator.TempJob);

        //initialize the sample
        for (int i = 0; i < inputSize; i++)
        {
            input[i] = UnityEngine.Random.Range(0, 10);
        }
        jobData             = new ParallelJob();
        jobData.input       = input;
        jobData.nthreads    = numberOfThreads;
        jobData.inputSize   = inputSize;
        jobData.foundPrimes = numberOfFoundPrimes;

        //pass to scheduler - divide the input interval with the threads so we get (thread number) of chunks and we can calculate thread id's in the Execute method
        //(roughly the same as static scheduling)
        handle = jobData.Schedule(inputSize, inputSize / numberOfThreads);

        //waiting for all threads to finish
        handle.Complete();

        //summarize the total prime numbers we found on each thread
        int totalFoundPrimes = 0;

        for (int i = 0; i < numberOfThreads; i++)
        {
            totalFoundPrimes += jobData.foundPrimes[i];
        }

        //stop our stopper
        sw.Stop();
        results.text += ("\n Done! Elapsed time: " + sw.ElapsedMilliseconds / 1000f + "\n Found: " + totalFoundPrimes);

        // disposal of nativearrays
        input.Dispose();
        numberOfFoundPrimes.Dispose();
    }
コード例 #3
0
        private void RunDemo()
        {
            ParallelJob parallelJob = new ParallelJob
            {
                Number = m_MyNumber,
                Data   = m_MyData
            };

            m_ParallelJobHandle = parallelJob.Schedule(m_MyData.Length, 32);

            JobHandle.ScheduleBatchedJobs();
            m_ParallelJobHandle.Complete();
            if (m_ParallelJobHandle.IsCompleted)
            {
                for (int i = 0; i < m_MyData.Length; i++)
                {
                    Debug.Log(parallelJob.Data[i]);
                }
                FreeMemoryData();
            }
        }
コード例 #4
0
    private void runDemo()
    {
        ParallelJob parallelJob = new ParallelJob {
            number = myNumber,
            data   = myData
        };

        myParallelJobHandle = parallelJob.Schedule(myData.Length, 32);

        JobHandle.ScheduleBatchedJobs();

        myParallelJobHandle.Complete();

        if (myParallelJobHandle.IsCompleted)
        {
            for (int i = 0; i < myData.Length; i++)
            {
                Debug.Log(parallelJob.data[i]);
            }

            freeMemoryData();
        }
    }
コード例 #5
0
    // Update is called once per frame
    void Update()
    {
        if (useThread)
        {
            ParallelJob tempParallelJob = new ParallelJob()
            {
                deltaTime = Time.deltaTime
            };
            NativeArray <float3> eulerAngles = new NativeArray <float3>(goList.Count, Allocator.TempJob);
            for (int i = 0; i < goList.Count; ++i)
            {
                eulerAngles[i] = goList[i].transform.eulerAngles;
            }
            tempParallelJob.eulerAngles = eulerAngles;
            JobHandle jobHandle = tempParallelJob.Schedule(goList.Count, 10);
            jobHandle.Complete();
            for (int i = 0; i < goList.Count; ++i)
            {
                goList[i].transform.eulerAngles = eulerAngles[i];
            }

            eulerAngles.Dispose();
        }
        else
        {
            foreach (var item in goList)
            {
                item.transform.eulerAngles += new Vector3(0, 30 * Time.deltaTime, 0);

                for (int i = 0; i < 1000; ++i)
                {
                    float result = math.exp10(math.sqrt(5 * 6));
                }
            }
        }
    }
コード例 #6
0
    // Start is called before the first frame update
    void Start()
    {
        ParallelJob parallelJob = new ParallelJob
        {
            number = myNumber,
            data   = myData,
        };

        parallelJobHandle = parallelJob.Schedule(myData.Length, 32);

        JobHandle.ScheduleBatchedJobs();

        parallelJobHandle.Complete();

        if (parallelJobHandle.IsCompleted)
        {
            for (int i = 0; i < myData.Length; ++i)
            {
                Debug.Log(parallelJob.data[i]);
            }
        }

        myData.Dispose();
    }