热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JobSystem的IJobParallelFor使用

IJobParallelFor有啥用:1.IJob一次只能执行一个任务,如果需要重复执行某个动作很多次,就可以用到并行任务IJobParallelFor2.ParallelForj



IJobParallelFor 有啥用:
1.IJob 一次只能执行一个任务,如果需要重复执行某个动作很多次,就可以用到并行任务 IJobParallelFor
2.ParallelFor jobs使用 NativeArray作为数据源,并且运行在多个core上,每个job只负责处理完整数据的一个子集Execute(idx)方法对于数据源NativeArray中的每个item都调用一次
3.需要手动执行次数,表示需要分多少次独立Execute执行,一般直接取 NativeArray 的数组长度作为执行次数,一次处理一个数据
4.当一个native job提前完成它的batches,它会从其他的native job偷取一部分batches,然后继续执行

颗粒度问题:
分的太细会有work不断重建开销,分的太粗又会有单核负载问题
(推荐:从1开始逐步增加,知道性能不再提高)

注意事项:
1.不能在job中访问static数据
2.Flush scheduled batchs
====>JobHandle.Complete:直接开始执行。
====>不flush batch会导致调度延迟到主线程等待batch执行结果时才触发执行
3.不要试图更新NativeContainer的内容
====>navtiveArray[0]++
4.主线程在访问数据之前,需要依赖的job调用complete
====>不能只是check JobHandle.IsCompleted,而是需要手动调用JobHandle.Complete()
5.在主线程中使用Schedule和Complete
====>这两个函数只能在主线程中调用。不能因为一个job依赖另一个job,就在前一个job中手动schedule另一个job
6.在正确的时间使用Schedule和Complete
====>Schedule:在数据填充完毕,立马调用
====>Complete:只在你需要result的时候调用
7.NativeContainer添加read-only标记
====>默认是可读写的,如果确定只读就标记为read-only,可以提升性能
8.不要在job里面分配托管内存managed memory
====>在job里面分配托管内存是非常慢的,而且会导致Burst compiler没法使用
====>Burst是基于LLVM的后端编译技术,它可以利用平台特定能力将c# jobs代码编译成高度优化过的机器码



代码如下:

using System.Collections;
using System.Collections.Generic;
using Unity.Collections;
using Unity.Jobs;
using UnityEditor;
using UnityEngine;
public class TestJobParallelFor_1 : MonoBehaviour
{
public struct MyParallelJob : IJobParallelFor
{
public NativeArray a;
public NativeArray b;
public NativeArray result;
public void Execute(int index)
{
result[index] = a[index] + b[index];
}
}
void ScheduleParallelJob()
{
NativeArray a = new NativeArray(10, Allocator.TempJob);
NativeArray b = new NativeArray(10, Allocator.TempJob);
NativeArray result = new NativeArray(10, Allocator.TempJob);
int dataCount = 10;
for (int i = 0; i {
a[i] = i * 0.3f;
b[i] = i * 0.5f;
}
MyParallelJob jobData = new MyParallelJob();
jobData.a = a;
jobData.b = b;
jobData.result = result;
JobHandle handle = jobData.Schedule(dataCount, 1);
handle.Complete();
for (int i = 0; i {
Debug.LogError(result[i]);
}
a.Dispose();
b.Dispose();
result.Dispose();
}
private void Update()
{
ScheduleParallelJob();
}
}


推荐阅读
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
author-avatar
tantyana428_673
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有