当前位置: 首页 > news >正文

Unity Burst编译

官网文档:https://docs.unity3d.com/Packages/com.unity.burst@1.8/manual/index.html

Unity 之Burst 底层原理:https://zhuanlan.zhihu.com/p/623274986

Burst 编译器入门(五):https://developer.unity.cn/projects/5e62f15eedbc2a1feeebb83e

LLVM:https://llvm.org/

LLVM:https://aosabook.org/en/v1/llvm.html

編譯器 LLVM 淺淺玩:https://medium.com/@zetavg/%E7%B7%A8%E8%AD%AF%E5%99%A8-llvm-%E6%B7%BA%E6%B7%BA%E7%8E%A9-42a58c7a7309#20b5

一个故事看懂CPU的SIMD技术:https://www.cnblogs.com/xuanyuan/p/16048303.html

介绍

  • Burst 是一个编译器,目的是把代码跑的更高效。主要优化技术密集的任务。
    • LLVM的激进优化。
      • SIMD向量化:循环操作转为单指令多数据指令。(一个加法变四个加法一起算)
      • 循环展开:if等分支展开,比如经常true的再优化。Hint intrinsics
      • 自动内联:把小函数自动内联展开。
      • 无GC检测:因为操作都是非托管数据,所以省去一些不必要的检测。
  • 2019年官方说的: Burst必须只能在JobSystem中使用,其他地方是不能用的。
  • 从 IL/.NET 字节码转换为使用 LLVM 编译器的优化原生 CPU 代码。
    • C#代码 -> IL -> LLVM IR -> 原生机器码
  • 适用于:
    • 物理碰撞。
    • 粒子系统刷新。
    • 图形算法处理。

LLVM

  • 模块化编译器,是一组库,可以针对特定问题优化。
    在这里插入图片描述
    在这里插入图片描述

和 IL2CPP 的关系

  • 互不影响,两套编译方式。

  • 普通代码走IL2CPP编译成C++机器码。

  • 标记[BurstCompile]的代码,有Burst单独编译优化,生成更高效的机器码。

调试

  • https://docs.unity3d.com/Packages/com.unity.burst@1.8/manual/editor-burst-inspector.html

  • Unity菜单:Jobs/Burst/Open Inspector
    在这里插入图片描述

测试

  • 对比各种遍历耗时

    • 测试了 List<T> 和 定长数组,相同操作都是定长数组更快一点。
  • 测试长度遍历一千万,测了一百万差异差不多。

测试代码

private const int TEST_COUNT = 10000000;
private float[] _managedArray = new float[TEST_COUNT];    // 托管
private NativeArray<float> _nativeArray;                  // 非托管private void Run()
{_nativeArray = new NativeArray<float>(TEST_COUNT, Allocator.Persistent);for (int i = 0; i < TEST_COUNT; i++) {_managedArray[i] = i;_nativeArray[i] = i;}// 测试List,同下面Array...// Debug.LogError("Test Array");using (new MyStopWatch("ManagedArray")){for (int i = 0; i < TEST_COUNT; i++) _managedArray[i] = i + 5;}using (new MyStopWatch("TestNativeArray")){for (int i = 0; i < TEST_COUNT; i++) _nativeArray[i] = i + 5;}using (new MyStopWatch("TestNativeList Job")){var job = new NativeArrayJob { Data = _nativeArray };job.Run();}using (new MyStopWatch("TestNativeList Burst Job")){var job = new NativeArrayBurstJob { Data = _nativeArray };job.Run(); }using (new MyStopWatch("TestNativeArray Burst JobParallelFor")){// List动态扩容,不支持多线程写入var job = new NativeArrayBurstJobParallelFor() { Data = _nativeArray };job.Schedule(TEST_COUNT, 64).Complete(); }using (new MyStopWatch("TestNativeArray Burst")){TestNativeArrayBurst(ref _nativeArray);}using (new MyStopWatch("TestNativeArray Burst Break")){TestNativeArrayBurstBreak(ref _nativeArray);}// Natvie容器要自己释放_nativeList.Dispose();
}// 普通带Burst编译
[BurstCompile]
private static void TestNativeArrayBurst([NoAlias]ref NativeArray<float> list)
{for (int i = 0; i < TEST_COUNT; i++) list[i] = i + 5;
}// 带Burst编译,但是加分支打断SIMD向量化
[BurstCompile]
private static void TestNativeArrayBurstBreak([NoAlias]ref NativeArray<float> list)
{for (int i = 0; i < TEST_COUNT; i++){if (i == 0) list[i] = i + 7; // 加个分支,打断Loop vectorizationlist[i] = i + 5;}
}// 普通Job
struct NativeArrayJob : IJob
{public NativeArray<float> Data;public void Execute(){for (int i = 0; i < TEST_COUNT; i++) Data[i] = i + 5;}
}// 带Burst的Job
[BurstCompile]
struct NativeArrayBurstJob : IJob
{public NativeArray<float> Data;public void Execute(){for (int i = 0; i < TEST_COUNT; i++) Data[i] = i + 5;}
}// 带Burst的多线程Job
[BurstCompile]
struct NativeArrayBurstJobParallelFor : IJobParallelFor
{public NativeArray<float> Data;public void Execute(int index){Data[index] = index + 6;}
}

测试结果

  • PC端跑一千万次循环array[i]=i+5

    在这里插入图片描述

  • MUMU模拟器 64位,跑一亿次循环array[i]=i+5

    在这里插入图片描述

安卓跑一亿次array[i]=i+5耗时代码
普通数组80ms在这里插入图片描述
NativeArray32ms在这里插入图片描述
丢到Job中执行34ms在这里插入图片描述
Burst编译的Job31ms在这里插入图片描述
Burst编译的多线程Job。不支持NativeList<T>,因为可能出现动态扩容,导致线程不安全。28ms在这里插入图片描述
普通Burst函数34ms在这里插入图片描述
普通Burst函数,但是打断SIMD向量化78ms在这里插入图片描述
  • 跑一亿次循环array[i]=math.sin(i+5),左图:MUMU模拟器 64位,右图:RedmiNote12
    在这里插入图片描述
    在这里插入图片描述
安卓跑一亿次sin(i+5)模拟器耗时/ms真机耗时/ms
普通数组608015570
NativeArray592215533
丢到Job中执行590315415
Burst编译的Job21251505
Burst编译的多线程Job573332
普通Burst函数21161503
普通Burst函数,但是打断SIMD向量化235208047
Burst编译的Job,但是打断SIMD向量化231658036
Burst编译的多线程Job,但是打断SIMD向量化59441738
  • 模拟器下,同样循环内容下(有ifmath.sin),burst编译反而跑的更慢了。可能中低端设备负优化了?

SIMD向量化

  • https://docs.unity3d.com/Packages/com.unity.burst@1.8/manual/optimization-loop-vectorization.html

  • 如果有分支或者计算结果有前后依赖,就无法向量化。简单的计算可以手动向量化用float4等。
    在这里插入图片描述


总结

  1. 复杂计算效率 Burst + JobParallelFor > Burst + Job >= Burst > Job >= 常规。

  2. 平常开发不涉及大量计算,直接用托管List<T>等常规容器就好了。托管环境Native容器虽然也快一点,但需要自己释放。

相关文章:

Unity Burst编译

官网文档&#xff1a;https://docs.unity3d.com/Packages/com.unity.burst1.8/manual/index.html Unity 之Burst 底层原理&#xff1a;https://zhuanlan.zhihu.com/p/623274986 Burst 编译器入门&#xff08;五&#xff09;&#xff1a;https://developer.unity.cn/projects/5e…...

软件测试中的BUG

文章目录 软件测试的生命周期BugBug 的概念描述 Bug 的要素案例Bug 级别Bug 的生命周期与开发产生争执怎么办&#xff1f;【高频面试题】先检查自身&#xff0c;Bug 是否描述的不清楚站在用户角度考虑并抛出问题Bug 的定级要有理有据提⾼自身技术和业务水平&#xff0c;做到不仅…...

LabVIEW基于IMAQ实现直线边缘检测

本程序基于 NI Vision Development 模块&#xff0c;通过 IMAQ Find Straight Edges 函数&#xff0c;在指定 ROI&#xff08;感兴趣区域&#xff09; 内检测多条直线边缘。用户可 动态调整检测参数 或 自定义ROI&#xff0c;实时观察识别效果&#xff0c;适用于 高精度视觉检测…...

C#:LINQ学习笔记01:LINQ基础概念

一、LINQ 架构体系 1. LINQ 的核心思想 统一查询模型&#xff1a;对对象、XML、数据库等不同数据源使用一致的语法。强类型检查&#xff1a;编译时类型安全&#xff0c;减少运行时错误。 2. 核心组件 技术数据源典型场景LINQ to Objects内存集合 (IEnumerable)过滤/排序集合…...

15Metasploit框架介绍

metasploit目录结构 MSF ——the metasploit framework 的简称。MSF高度模块化&#xff0c;即框架结构由多个module组成&#xff0c;是全球最受欢迎的工具 是一筐开源安全漏洞利用和测试工具&#xff0c;集成了各种平台上常见的溢出漏洞和流行sheellcode&#xff0c;并且保持…...

NLP如何训练AI模型以理解知识

一、自然语言处理&#xff08;NLP&#xff09;的定义与核心目标 1. 什么是自然语言处理&#xff1f; NLP是计算机科学与人工智能的交叉领域&#xff0c;旨在让机器具备以下能力&#xff1a; • 理解&#xff1a;解析人类语言&#xff08;文本或语音&#xff09;的语法、语义和…...

【树莓派学习】树莓派3B+的安装和环境配置

【树莓派学习】树莓派3B的安装和环境配置 文章目录 【树莓派学习】树莓派3B的安装和环境配置一、搭建Raspberry Pi树莓派运行环境1、下载树莓派镜像下载器2、配置wifi及ssh3、SSH访问树莓派1&#xff09;命令行登录2&#xff09;远程桌面登录3&#xff09;VNC登录&#xff08;推…...

python连接neo4j的方式汇总

python连接neo4j的方式汇总 1.官方驱动&#xff08;neo4j&#xff09;特点代码示例 2. 全功能ORM&#xff08;py2neo&#xff09;特点代码示例 3. 领域驱动设计框架&#xff08;neomodel-odm&#xff09;特点代码示例 4. 异步高性能驱动&#xff08;asyncneo4j&#xff09;特点…...

Graph RAG 迎来记忆革命:“海马体”机制让问答更精准!

随着生成式 AI 技术的快速发展,RAG(Retrieval-Augmented Generation)和 Agent 成为企业应用大模型的最直接途径。然而,传统的 RAG 系统在准确性和动态学习能力上存在明显不足,尤其是在处理复杂上下文和关联性任务时表现不佳。近期,一篇论文提出了 HippoRAG 2,这一新型 R…...

Spring(三)容器-注入

一 自动注入Autowire 代码实现&#xff1a; package org.example.spring01.service;import org.springframework.stereotype.Service;Service public class UserService {}package org.example.spring01.controller;import lombok.Data; import lombok.ToString; import org.…...

剧本杀门店预约小程序:市场发展下的刚需

在剧本杀爆发式增长下&#xff0c;门店数字化运营的模式正在市场中逐渐展开&#xff0c;线下门店的竞争方向已发生了全新转变&#xff01; 目前&#xff0c;数字化发展已经成为了消费市场的刚需&#xff0c;利用网络的便捷性提高服务&#xff0c;优化运营&#xff0c;提高自身…...

stable-diffusion-webui 加载模型文件

背景 stable-diffusion-webui 安装完毕后&#xff0c;默认的模型生成的效果图并不理想&#xff0c;可以根据具体需求加载指定的模型文件。国内 modelscope 下载速度较快&#xff0c;以该站为例进行介绍 操作步骤 找到指定的模型文件 在 https://modelscope.cn/models 中查找…...

Ubuntu20.04双系统安装及软件安装(十一):向日葵远程软件

Ubuntu20.04双系统安装及软件安装&#xff08;十一&#xff09;&#xff1a;向日葵远程软件 打开向日葵远程官网&#xff0c;下载图形版本&#xff1a; 在下载目录下打开终端&#xff0c;执行&#xff1a; sudo dpkg -i SunloginClient(按tab键自动补全)出现报错&#xff1a; …...

华为云 | 快速搭建DeepSeek推理系统

DeepSeek&#xff08;深度求索&#xff09;作为一款国产AI大模型&#xff0c;凭借其高性能、低成本和多模态融合能力&#xff0c;在人工智能领域崛起&#xff0c;并在多个行业中展现出广泛的应用潜力。 如上所示&#xff0c;在华为云解决方案实践中&#xff0c;华为云提供的快速…...

printf 与前置++、后置++、前置--、后置-- 的关系

# 前置和前置-- 先看一段代码 大家是不是认为printf输出的是 2 3 3 2 1 1 但是实际输出的是 3 3 3 1 1 1 在这两行printf函数代码里&#xff0c;编译器会先计算 a 和 --a 的值&#xff0c;然后再 从右向左 开始输出。 printf函数中&#xff0c;如果有多个…...

centos7操作系统下安装docker,及查看docker进程是否启动

centos7下安装docker&#xff0c;需要用到的yun命令 &#xff08;yum命令用于添加卸载程序&#xff09; 1.设置仓库&#xff1a; yum-config-manager \--add-repo \http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 2.安装 Docker Engine-Community yum in…...

【向量数据库Weaviate】 和Elasticsearch的区别

Weaviate 和 Elasticsearch 是两种不同类型的数据库&#xff0c;设计目标和应用场景有显著差异。以下是它们的核心区别和适用场景的详细对比&#xff1a; 1. 设计目标与核心能力 维度WeaviateElasticsearch核心能力向量数据库 图数据库&#xff08;语义搜索优先&#xff09;全…...

深度学习-大白话解释循环神经网络RNN

目录 一、RNN的思想 二、RNN的基本结构 网络架构 ​关键点 三、RNN的前向传播 四、RNN的挑战:梯度爆炸和梯度消失 问题分析 ​示例推导 五、LSTM:RNN的改进 核心组件 ​网络架构 3. LSTM 的工作流程 4. 数学公式总结 5. LSTM 的优缺点 ​优点 ​缺点 6. LSTM 的…...

python3.13安装教程【2025】python3.13超详细图文教程(包含安装包)

文章目录 前言一、python3.13安装包下载二、Python 3.13安装步骤三、Python3.13验证 前言 本教程将为你详细介绍 Python 3.13 python3.13安装教程&#xff0c;帮助你顺利搭建起 Python 3.13 开发环境&#xff0c;快速投身于 Python 编程的精彩实践中。 一、python3.13安装包下…...

RocketMQ的运行架构

目录 1. 核心组件(1) NameServer(2) Broker(3) Producer(4) Consumer 2. 消息流转流程3. 高可用机制4. 扩展性与负载均衡5.容错机制5. 特殊功能支持6. 典型部署架构总结 RocketMQ 是一款高性能、高可靠的分布式消息中间件&#xff0c;其运行架构设计为分布式、可扩展、高可用的…...

三步掌握Dark Reader:从入门到精通的护眼浏览解决方案

三步掌握Dark Reader&#xff1a;从入门到精通的护眼浏览解决方案 【免费下载链接】darkreader Dark Reader Chrome and Firefox extension 项目地址: https://gitcode.com/gh_mirrors/da/darkreader Dark Reader是一款能够为任何网站启用深色模式的浏览器扩展&#xff…...

别死记硬背了!用Python的NumPy库,5分钟搞定线性代数里的矩阵运算(附代码)

用Python的NumPy库轻松玩转线性代数&#xff1a;矩阵运算实战指南 线性代数作为现代科学与工程的基石&#xff0c;在机器学习、计算机图形学、量化金融等领域无处不在。但传统教材中抽象的数学符号和繁琐的手工计算&#xff0c;往往让学习者望而生畏。今天&#xff0c;我们将用…...

5分钟搞定fastANI安装与基因组比对:从conda安装到结果解读全流程

5分钟搞定fastANI安装与基因组比对&#xff1a;从conda安装到结果解读全流程 第一次接触基因组比对时&#xff0c;我被各种复杂的参数和晦涩的结果文件搞得晕头转向。直到发现了fastANI这个神器——它不仅能快速计算基因组间的平均核苷酸相似性&#xff08;ANI&#xff09;&am…...

【AI微实验】这就deepseek对音频处理的理解╮(╯▽╰)╭

【手把手】零基础用PythonLibrosa搞定古琴音高识别&#xff0c;附完整代码1. 为什么要用代码“听”古琴&#xff1f;——传统音乐数字化的第一关1.1 从“泠泠七弦上”到“0和1”&#xff1a;音乐信息检索的价值1.2 核心任务拆解&#xff1a;基频&#xff08;F0&#xff09;是什…...

DIY电源改造必备:TL594与SG3524 PWM控制器实战对比(附电路图)

DIY电源改造实战&#xff1a;TL594与SG3524 PWM控制器深度对比与电路设计指南 1. 从零认识PWM控制器的核心价值 在电子爱好者的工作台上&#xff0c;电源改造项目总是充满魅力与挑战。无论是将旧电脑电源改造成可调实验室电源&#xff0c;还是为自制音响系统设计高效供电模块&a…...

提升code-server前端性能的终极指南:渐进式图片加载高级技巧

提升code-server前端性能的终极指南&#xff1a;渐进式图片加载高级技巧 【免费下载链接】code-server VS Code in the browser 项目地址: https://gitcode.com/GitHub_Trending/co/code-server code-server作为一款能在浏览器中运行的VS Code实现&#xff0c;让开发者可…...

LTI系统设计避坑指南:因果性与稳定性在实际工程中的5个关键检查点

LTI系统设计避坑指南&#xff1a;因果性与稳定性在实际工程中的5个关键检查点 在数字信号处理领域&#xff0c;线性时不变&#xff08;LTI&#xff09;系统的设计是工程师日常工作的核心。然而&#xff0c;理论推导与工程实践之间往往存在一道鸿沟——许多在数学上完美的系统模…...

别再让AI失忆了!手把手教你用Mem0为ChatGPT添加长期记忆(附Next.js实战代码)

为Next.js聊天应用注入长期记忆&#xff1a;Mem0集成实战指南 当你的AI助手开始记住用户的咖啡偏好和生日祝福时&#xff0c;整个交互体验会发生质的变化。本文将带你从零开始&#xff0c;在Next.js应用中实现这种"记忆魔法"。 1. 环境准备与Mem0初始化 首先创建一个…...

CREST:如何用5分钟开启分子构象探索之旅?

CREST&#xff1a;如何用5分钟开启分子构象探索之旅&#xff1f; 【免费下载链接】crest Conformer-Rotamer Ensemble Sampling Tool based on the xtb Semiempirical Extended Tight-Binding Program Package 项目地址: https://gitcode.com/gh_mirrors/crest/crest 在…...

Pencil:重新定义设计与开发的边界

&#x1f3a8; Pencil&#xff1a;重新定义设计与开发的边界 更多问题讨论和资料获取&#xff0c;请关注文章最后的微信公众号 当"设计即代码"成为现实&#xff0c;前端开发者的工作流正在经历一场革命 &#x1f4d6; 什么是 Pencil&#xff1f; 如果你是一名前端开…...