Unity Burst详解

【简介】

Burst是Unity的编译优化技术,优化了从C#代码编译成Native代码的过程,经过编译优化后代码有更高的运行效率。

在Unity中使用Burst很简单,在方法或类前加上[BurstCompile]特性即可。在构建时编译代码的步骤,Burst编译器会识别该特性对方法或类做编译优化。其适用于高性能计算的场景,逻辑复杂的场景不适用。

Burst编译的实现得益于已有的SIMD和LLVM技术。

【SIMD】

在现代 CPU 中,并行性操作大致分为三种类型:

  • 指令级并行,主要由 cpu 流水线技术,乱序执行技术等技术完成
  • 线程级并行,主要依靠多核多线程技术实现
  • 数据级并行,主要依靠 SIMD (单指令多数据) 来实现

SIMD是CPU硬件设计的一部分,是的CPU可以同时对多个数据执行相同的操作。

指令执行时(指令由操作码和操作数构成)CPU先访问缓存,缓存分为指令缓存和数据缓存,如果缓存中有指令就读取,没有指令从内存中读取;读取数据的过程也类似。

以加法为例,对于5+2这个加法计算,最少需要四条指令:

  1. 将数值 5 加载到寄存器中(LOAD操作码)
  2. 将数值 2 加载到寄存器中(LOAD操作码)
  3. 将两个寄存器中的数值相加(ADD操作码)
  4. 将相加后的结果存储到指定的寄存器或内存中(STORE操作码)

在SISD(单指令单数据)中,每个指令只会取一次数据,而在SIMD(单指令多数据)中,一次指令会取多个数据,节省了CPU获取数据的时间。

一次性取出来的数放在向量寄存器中,但向量寄存器大小有限,在AVX指令集中有256位。

在C#中,float类型占64位,一般要4个float类型一组。

现代编译器有三种方式来支持 SIMD:

  • 编译器能够在没有用户干预的情况下生成支持使用硬件SIMD的代码,称之为自动矢量化
  • 通过使用的Intrinsics 函数实现 SIMD
  • 使用矢量 C++ 类 (仅限ICC编译器) 来实现 SIMD

(Intrinsics函数是一种内建函数,它们用于实现高级别的底层操作。这些函数通常由编译器提供,并且可以直接映射到特定的硬件指令。使用Intrinsics函数可以实现对特定硬件功能的直接访问,从而提高代码的性能和效率。

内联函数通常用关键字inline声明,是由编译器处理的普通函数,编译器会根据需要将函数内容直接插入到调用处,减少了函数调用的开销。而Intrinsics函数一般不需要显式声明,编译器会自动识别并将其优化为特定的硬件指令 )

Unity.Mathematics提供了支持SIMD的数据类型,例如float4/int4等类型,在Job中需要使用这些数据类型。

在Job中要多用float4类型才有效,例如有一个float类型的数组,可以转为float4类型的数组,有利于在循环计算时自动矢量化。

【LLVM】

传统编译器架构为:

frontEnd(前端)检查源代码是否存在错误,将源代码分析成词法单元,然后进行语法分析生成抽象语法树,生成中间IR语言

Optimizer(优化) 对中间IR语言进行优化,消除冗余计算,内联、变量折叠等

BackEnd(后端) 最终将IR中间语言生成目标机器所能执行的代码

这种问题在于不同语言都要有各自的编译器和优化手段,LLVM期望提供一种IR标准,不同语言经过编译后先生成LLVM IR语言,只需要针对其做优化即可。

新增一个语言时,只需新实现一个前端,新增一种设备后,只需新实现一个后端

BurstCompiler会根据特性找到需要编译的方法,将方法对应的C# IR转为LVVM IR,随后针对LVVM IR做优化,编译。

【Burst使用】

支持的类型和语法

可以简单的将BurstCompile特性至于方法或类上,但不是所有的方法和类都支持。情况如下:

  • 支持基元类型:bool/byte/int/long/float/double,不支持char、string、decimal
  • 支持Unity.Mathematics中的向量类型,例如bool3\bool4\int3\int4\float3\float4等
  • 支持枚举类型、结构体、元组、System.IntPtr、Span<T>
  • 支持DllImport and internal calls 
  • 不支持Managed Array,例如int[] a;支持NativeArray
  • 方法中不能引用managed object
  • 不支持Try Catch语法

打Log

代码中Log是少不了的,Burst对Debug.Log有额外支持,例如:

Debug.Log("This a string literal");


int value = 256;
Debug.Log($"This is an integer value {value}"); 

//string需要使用FixedString,例如:
FixedString128Bytes str = "fixedstring128";
Debug.Log(str);

 编译检查

为避免在构建时才发现Burst编译不过,提供了Burst Inspector可以在Editor下预编译,以便查看编译结果

通过Jobs > Burst > Open Inspector 打开可视化面板,面板会显示编译结果

面板左边显示了可以正常编译得Job,右边显示当前选中的Job的编译结果,依次是:

  • Assembly:最终优化生成的NativeCode
  • .NET IL:原始的C# Job代码生成的IL
  • LLVM IR (Unoptimized) :未优化的LLVM IR
  • LLVM IR (Optimized):优化后的LLVM IR
  • LLVM IR Optimization Diagnostics:提供优化诊断细节

舍弃编译

当在类或结构体添加BurstCompile特性后,默认对其内所有方法做编译,如果某个方法我们使用了Managed Object而不想编译,可以使用[BurstDiscard]特性。

注意,使用该特性时,方法不能有返回值,可以通过ref或者out传递返回值

同步编译

Editor上Job是默认异步编译的,首次执行到Job时才会异步编译。通过[BurstCompile(CompileSynchronously = true)]开启同步编译

精度设定

浮点数精度会影响计算性能,默认采用中等精度,可以通过[BurstCompile(FloatPrecision.Med, FloatMode.Fast)]指定精度

指定取值范围

对参数和返回值指定取值范围有利于编译器做特定的代码优化,例如

[return:AssumeRange(0u, 13u)]
static uint WithConstrainedRange([AssumeRange(0, 26)] int x)
{
    return (uint)x / 2u;
}

分支指定

 可以通过Unity.Burst.CompilerServices.Hint.Likely告诉编译器该分支大概率为true,需要重点优化,例如

if (Unity.Burst.CompilerServices.Hint.Likely(b))
{
    // Any code in here will be optimized by Burst with the assumption that we'll probably get here!
}
else
{
    // Whereas the code in here will be kept out of the way of the optimizer.
}

【参考】

深入浅出让你理解什么是LLVM - 简书

https://zhuanlan.zhihu.com/p/472813616

Quick Start | Burst | 1.7.4

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/951702.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux文件系统的安全保障---Overlayroot!

overlayroot 是一种使用 OverlayFS 实现的功能&#xff0c;可将根文件系统挂载为只读&#xff0c;并通过一个临时的写层实现对文件系统的修改。这种方法非常适合嵌入式设备或需要保持系统文件完整性和安全性的场景。下文以 RK3568 平台为例&#xff0c;介绍制作 overlayroot 的…

Http请求响应——请求

Http概述 Http协议&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;&#xff0c;是一种用于传输网页数据的协议&#xff0c;规定了浏览器和服务器之间进行数据传输的规则&#xff0c;简单说来就是客户端与服务器端数据交互的数据格式。 客户端…

2025域名出售交易平台PHP源码

源码介绍 2025域名出售交易平台PHP源码,搭建即可正常使用&#xff0c;后台功能测试正常&#xff0c;前台测试正常,无需到处找教程或修复&#xff0c;教程一次性到位 搭建教程 PHP必须是5.6的 导入数据库 数据库配置文件 config/config.php 后台 http://域名/ymadmin 用户&am…

Microsoft Azure Cosmos DB:全球分布式、多模型数据库服务

目录 前言1. Azure Cosmos DB 简介1.1 什么是 Azure Cosmos DB&#xff1f;1.2 核心技术特点 2. 数据模型与 API 支持2.1 文档存储&#xff08;Document Store&#xff09;2.2 图数据库&#xff08;Graph DBMS&#xff09;2.3 键值存储&#xff08;Key-Value Store&#xff09;…

后端技术选型 sa-token校验学习 上 登录校验复习

sa-token 的官网 Sa-Token 复习 首先我们要明确一下 cookie 是什么 登录校验 Sa-Token 官方文档里面的 对于一些登录之后才能访问的接口&#xff08;例如&#xff1a;查询我的账号资料&#xff09;&#xff0c;我们通常的做法是增加一层接口校验&#xff1a; 如果校验通过…

【教程】Unity 本地化多语种 | Localization 工具组

开发平台&#xff1a;Unity 6.0 编程平台&#xff1a;Visual Studio 2022 编程语言&#xff1a;CSharp 6.0 工具包类&#xff1a;Localization   一、前言 本地化多语言类型是软件面向国际化所必须的功能项。Unity 在 2022 版本后推出 Localization 工具包&#xff0c;以降低…

matlab编写分段Hermite插值多项式

文章目录 原理使用分段Hermite插值多项式原因公式第一类的两个插值积函数第二类的两个插值积函数 例题法一法二 代码分段 Hermite 插值的思路&#xff1a;分段 Hermite 插值多项式的构造&#xff1a;MATLAB 实现代码&#xff1a;结果如图&#xff1a;注归一化变量的作用&#x…

Elasticsearch:优化的标量量化 - 更好的二进制量化

作者&#xff1a;来自 Elastic Benjamin Trent 在这里&#xff0c;我们解释了 Elasticsearch 中的优化标量量化以及如何使用它来改进更好的二进制量化 (Better Binary Quantization - BBQ)。 我们的全新改进版二进制量化 (Better Binary Quantization - BBQ) 索引现在变得更强大…

【数据库】六、数据库设计

文章目录 六、数据库设计1 数据库设计步骤1.1 规划阶段1.2 需求分析1.3 概念设计阶段(重点)1.4 逻辑设计阶段(重点)1.5 物理设计阶段1.6 数据库的实现1.7 数据库运行与维护 2 概念模型设计2.1 ER模型2.1.1 ER模型的基本元素2.1.2 联系的设计2.1.3 采用ER模型的概念设计2.1.4 ER…

onLoad 生命周期函数是否执行取决于跳转的方式和小程序的页面栈管理机制

文章目录 1. 页面跳转方式2. 你的场景分析3. 页面生命周期4. 总结5. 建议 在微信小程序中&#xff0c;页面跳转时&#xff0c; onLoad 生命周期函数是否执行取决于跳转的方式和小程序的页面栈管理机制。以下是详细说明&#xff1a; 1. 页面跳转方式 微信小程序提供了多种页面…

51c~Pytorch~合集4

我自己的原文哦~ https://blog.51cto.com/whaosoft/12311033 一、Pytorch~训练-使用 这里介绍了Pytorch中已经训练好的模型如何使用 Pytorch中提供了很多已经在ImageNet数据集上训练好的模型了&#xff0c;可以直接被加载到模型中进行预测任务。预训练模型存放在Pytorch的…

深度学习的原理和应用

一、深度学习的原理 深度学习是机器学习领域的一个重要分支&#xff0c;其原理基于多层神经网络结构和优化算法。以下是深度学习的核心原理&#xff1a; 多层神经网络结构&#xff1a;深度学习模型通常由多层神经元组成&#xff0c;这些神经元通过权重和偏置相互连接。输入数据…

基于人工智能的公司logo设计生成方法

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经深入到我们生活的方方面面。其中&#xff0c;基于AI的公司logo设计生成方法&#xff0c;不仅为品牌形象的塑造提供了新的思路&#xff0c;也为企业带来了前所未有的设计体验。本文将详细探讨这一新兴的、…

BO-CNN-BiLSTM-Multihead-Attention,贝叶斯优化CNN-BiLSTM融合多头注意力机制多变量回归预测

BO-CNN-BiLSTM-Multihead-Attention&#xff0c;贝叶斯优化CNN-BiLSTM融合多头注意力机制多变量回归预测 目录 BO-CNN-BiLSTM-Multihead-Attention&#xff0c;贝叶斯优化CNN-BiLSTM融合多头注意力机制多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Ma…

WPF系列九:图形控件EllipseGeometry

简介 EllipseGeometry用于绘制一个椭圆的形状。它通常与其他图形元素结合使用&#xff0c;比如 Path 或者作为剪切区域来定义其他元素的外形。 定义椭圆&#xff1a;EllipseGeometry 用来定义一个椭圆或者圆的几何形状。参与绘制&#xff1a;可以被用作 Path 元素的数据&…

ue5动画重定向,一键重定向。ue4小白人替换成ue5

这就是我们下载的 初学者动画内容包 点击设置选中列 绿色的是动画 黄色的关卡 蓝色是蓝图 ctrla 全选 ctrl鼠标左键 选中所有动画 重定向动画资产 不要选错&#xff0c;只要绿色 选择目标网格体 选择所有的绿色 动画 导出动画 添加前缀ycn 导出 一定要提前新建好存放的…

服务器漏洞修复解决方案

漏洞1、远程桌面授权服务启用检测【原理扫描】 Windows Remote Desktop Licensing Service is running: Get Server version: 0x60000604 1、解决方案&#xff1a;建议禁用相关服务避免目标被利用 方法一&#xff1a;使用服务管理器 打开“运行”对话框&#xff08;WinR&am…

uniapp 微信小程序内嵌h5实时通信

描述&#xff1a; 小程序webview内嵌的h5需要向小程序实时发送消息&#xff0c;有人说postMessage可以实现&#xff0c;所以试验一下&#xff0c;结果是实现不了实时&#xff0c;只能在特定时机后退、组件销毁、分享时小程序才能接收到信息&#xff08;小程序为了安全等考虑做了…

案例解读 | 香港某多元化综合金融企业基础监控+网管平台建设实践

PART01 项目背景 01客户简介案例客户是一家创立20多年的香港某多元化综合金融企业&#xff0c;其业务范围涵盖证券、期货、资产管理、财富管理等&#xff0c;凭借广泛的业务网络和多元化的金融服务产品&#xff0c;在市场中拥有显著的影响力。02痛点分析随着业务版图的持续拓展…

LabVIEW实现动态水球图的方法

水球图是一种直观展示百分比数据的图表&#xff0c;常用于数据监测与展示。LabVIEW 虽不直接支持水球图绘制&#xff0c;但可通过图片控件动态绘制波形&#xff0c;或借助 HTMLCSS 的 Web 控件实现。此外&#xff0c;还可以结合 Python 等第三方工具生成水球图&#xff0c;LabV…