news 2026/9/10 4:10:53

UE5 RHI机制深度解析:从MeshDrawPipeline到图形API的完整链路

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UE5 RHI机制深度解析:从MeshDrawPipeline到图形API的完整链路

UE5 RHI机制,说白了就是引擎里把各种图形API(DX11、DX12、Vulkan、Metal)统一起来的最后一道抽象层。很多人在业务层改`FPrimitiveComponent`、调材质、加渲染特性,改得飞起,但一碰到性能瓶颈或者“RHI Error”这类诡异崩溃,立刻就麻了。我之前也一样,总觉得RHI是引擎底层那些“大佬”才需要碰的东西,后来因为项目要自研一个特殊Pass,被迫把从MeshDrawPipeline到图形API的整条调用链追了一遍,才发现这里面藏着一半的UE渲染问题答案。

这篇文章就围绕这条链路展开。我会从RHI在引擎里的定位讲起,然后拆解一个MeshDrawCommand是怎么从场景数据一步步变成底层DrawCall,再讲FRHICommandList如何映射到D3D12/Vulkan这类图形API,最后附上我自己实操时用到的调试手段和踩坑记录。内容是给想深入渲染底层、却还没完全打通RHI这条线的朋友看的,尤其是那些已经会写自定义Pass、又想进一步搞懂“CPU提交”环节的人。

1. 为什么值得单独抠RHI这一层

很多Unity转UE的开发者,或者一直用蓝图堆逻辑的选手,第一次看到RHI这个词都会下意识绕开,觉得“引擎都封装好了,我调用就行了”。但事实是,UE5里所有渲染特效,从基础光照到Nanite、Lumen,最终都必须经过RHI才能落到GPU上。你如果不理解这一层,遇到GPU卡顿、DrawCall上不去、或者是内存暴涨这类问题,基本只能靠猜。

1.1 RHI在UE5渲染架构中的位置

先给一张简化但不失真的大局观。UE5的渲染链路大致可以分成三层:

  • 游戏逻辑层:`UPrimitiveComponent`、`AActor`这些,负责提供场景中“有什么东西”。
  • 渲染器层(Renderer):`FScene`、`FPrimitiveSceneProxy`、`FViewInfo`这些,负责决定“画什么、按什么顺序画”。
  • RHI层:`FRHICommandList`、`FRHIResource`这些,负责把渲染器的指令翻译成“具体某个图形API怎么调用”。

RHI就是最底下那层。它不关心你的场景里是地牢还是太空站,也不关心光照是Forward还是Deferred,它只关心一件事:把一条条渲染命令交付给Driver,让GPU真的去执行。

所以,当你在项目里看到`FBasePassMeshProcessor`、`FMeshDrawCommand`、`SetGraphicsPipelineState`这一串东西时,它们已经是在渲染器层的末端了;再往下跨一步,就是RHI。

1.2 RHI到底替我们干了什么(以及没干什么)

RHI这一层最核心的职责可以概括成三件事。

第一件事是资源抽象。你要创建一张贴图、一个顶点缓冲、一个常量缓冲,不需要关心底层是D3D12的`ID3D12Resource`还是Vulkan的`VkBuffer`,只需要跟`FRHITexture`、`FRHIBuffer`这些句柄打交道。引擎会通过`FDynamicRHI`的工厂方法在每次初始化时根据平台创建对应后端。

第二件事是命令录制与提交。渲染器层不会直接调用底层API画东西,而是往`FRHICommandList`里记录“设置渲染状态”“绑定Shader”“画索引三角形”这些操作。RHI线程把这些命令取走后,才会最终翻译成图形API调用。

第三件事是生命周期与安全。很多渲染资源是在游戏线程创建、渲染线程使用,底层API又有各自的资源屏障、同步规则,RHI层会帮你把这些规则封装成统一的接口,避免你直接跟D3D12的`ResourceBarrier`之类的东西搏斗。

但RHI没干什么呢?它不做排序、不做剔除、不做材质编译。这些都是渲染器层的事。很多人误以为“DrawCall多就一定是RHI瓶颈”,其实RHI只负责把已经确定好的MeshDrawCommand发出去,这些命令从哪来、能不能合并、能不能减少,是上面那层的事。

2. 从MeshDrawPipeline到Renderer:渲染命令是怎么被编排出来的

要理解RHI,光看RHI本身是不够的。真正让RHI有意义的前提,是前面那套复杂的MeshDrawPipeline已经把场景里成千上万个物体浓缩成了一堆可以提交的绘制命令。这一段我拆开讲。

2.1 场景代理、FMeshBatch与GPU Scene

先说源头。场景里一个可见物体,在游戏线程里是`UPrimitiveComponent`,但渲染器并不直接碰它,而是通过`FPrimitiveSceneProxy`访问。Proxy是渲染器线程视角下的“场景物体代表”,它会暴露`GetDynamicMeshElements`、`DrawStaticElements`这些函数,用来生成渲染器需要的数据。

每次视图更新时,渲染器会调用这些函数,拿到一个又一个`FMeshBatch`。可以粗暴地把`FMeshBatch`理解成“这个物体某一种绘制方式的最小描述”:它绑定了`VertexFactory`(顶点工厂,描述了顶点数据如何被解析)、`MaterialRenderProxy`(材质渲染代理,描述了用什么Shader和渲染状态)、`MeshIdInPrimitive`等等。

这里有个比较费解的点是`VertexFactory`。它并不是“位置+法线+UV”这种简单顶点布局,而是一整套“怎么通过引擎标准属性生成GPU读取数据的规则”。比如静态网格用`FLocalVertexFactory`,骨骼网格用`FGPUSkinVertexFactory`,程序化网格还有自己的工厂。RHI最后会拿这个VertexFactory跟材质Shader做匹配,确定输入布局。

另外UE5引入了GPU Scene,很多实例数据(如LocalToWorld等)是直接放在GPU缓冲区里,CPU侧只保留一个GPU的SRV索引。这跟后面的“GPU Driven Renderer”密切相关,但RHI本身不强制这个,它只是提供创建StructuredBuffer的接口,具体怎么用是渲染器层的事。

2.2 MeshPassProcessor与FMeshDrawCommand的生成

拿到了`FMeshBatch`之后,接下来就是MeshPassProcessor登场。UE5里每个重要的渲染Pass都有一个对应的Processor,比如`FBasePassMeshProcessor`对应BasePass,`FDepthPassMeshProcessor`对应Depth Pass,`FShadowDepthPassMeshProcessor`对应阴影深度。这些Processor的职责是:把FMeshBatch转换成当前Pass真正需要的`FMeshDrawCommand`。

转换过程中会做很多关键决策:

  • 根据材质与Pass选择合适的Shader组合。
  • 根据渲染特性(比如是否启用Nanite、是否启用Tessellation)决定要不要拆成多个Command。
  • 填充`FGraphicsPipelineStateInitializer`,这是后面生成RHI PSO的重要依据。
  • 整理顶点流、索引缓冲、着色器绑定参数。

FMeshDrawCommand才是真正“开箱即用”的绘制命令。它已经是一个高度“烘焙”后的数据结构,里面几乎包含了底层API画一次所需要的一切:PipelineState、Shader绑定、VertexStreams、IndexBuffer、FirstIndex、NumPrimitives、NumInstances、StencilRef等等。

你可以这样理解两者的区别:FMeshBatch是“我要怎么画这个物体”,包含的是相对高层的信息;FMeshDrawCommand是“某个Pass、某个View下,具体怎么调用底层绘制函数”,它已经把所有可变状态冻结了。这也解释了为什么MeshDrawCommand可以缓存、可以排序——因为它已经和具体执行细节绑定了。

2.3 从FMeshDrawCommand到一次真正的DrawCall

Renderer层在收集完所有MeshDrawCommand后,会按照状态排序、提交顺序等规则处理,然后在绘制阶段一个个执行。

具体执行时,渲染器会调用类似`SetMeshDrawCommandState`的函数,设置MeshDrawCommand里面的PSO、Shader、Stream等。然后调用`SubmitMeshDrawCommands`,最终走到类似下面这一条:

```cpp RHICmdList.DrawIndexedPrimitive( MeshDrawCommand.IndexBuffer, MeshDrawCommand.VertexStreams[0].VertexBuffer, MeshDrawCommand.FirstIndex, MeshDrawCommand.NumPrimitives, MeshDrawCommand.NumInstances ); ```

到了这一步,才真正进入RHI层的地盘。前面的所有工作,都是为了能在最后一刻把你早就准备好的绘制参数掏出来。

这里值得注意的一点是:UE5里MeshDrawCommand是分Pass缓存的。BasePass的Command和ShadowPass的Command会分别存储。也就是说,同一个物体,如果它要参与多个Pass,那它会被“加工”成多个不同的MeshDrawCommand,每个Pass对应一个。这也是为什么材质复杂性会影响DrawCall数量,因为同一个物体在多个Pass里都要分别画一次。

3. 打通最后一公里:RHI命令列表如何映射到图形API

MeshDrawCommand准备好了,渲染器开始拿着它往`FRHICommandList`里塞命令。这一节我重点讲RHI命令列表的内部机制,以及它跟D3D12、Vulkan等图形API的具体对应关系。

3.1 FRHICommandList 录制与提交模型

FRHICommandList本质上是一个命令缓冲区。渲染线程往里面追加各种RHI命令,比如`SetGraphicsPipelineState`、`SetVertexBuffer`、`DrawIndexedPrimitive`。这些命令会以函数指针加参数的方式被记录下来,形成一条可以“重放”的队列。

关键点在于:渲染线程录制命令,不一定立刻执行。所有命令会经过RHI线程(RHI Thread)或者Immediate Mode被真正发送给Driver。

UE5里最常见的执行模型是:

  • 游戏线程(GameThread)产生场景更新数据。
  • 渲染线程(RenderThread)执行SceneRenderer的渲染流程,往FRHICommandListImmediate里写命令。
  • RHI线程从Immediate CommandList里取出命令,调用当前平台的RHIBackend,最终调用底层API。

这里要特别说明一下`FRHICommandListImmediate`。它跟普通的FRHICommandList不同,它是“立即模式”的命令列表,主要在渲染线程上使用,也负责跨线程提交。你在自定义Pass里最常碰到的`RHICmdList`,其实就是这个Immediate版本。

这种录放机制带来的好处是可以把渲染线程的大量工作延后,也可以让多个线程并行录制命令。但代价是出了问题很难直接从调用栈里看出来——因为真正执行底层API的线程已经不是当初录制命令的线程了。

3.2 关键RHI对象:PipelineState、Buffer、Texture、Shader

RHI这一层有几个高频率出现的关键对象,值得每个做渲染的人都混个脸熟。

`FRHIGraphicsPipelineState`是其中最重要的一个。它封装了一次绘制需要的全部固定功能状态,包括光栅化状态(`FRasterizerState`)、混合状态(`FBlendState`)、深度模板状态(`FDepthStencilState`)、顶点声明、着色器组合。底层映射上,D3D12对应`ID3D12PipelineState`,Vulkan对应`VkPipeline`,Metal对应`MTLRenderPipelineState`。

创建PipelineState不是免费的。尤其D3D12和Vulkan,创建完整PSO的成本很高,需要经过驱动编译、校验等环节。所以UE5里会有`FPipelineStateCache`。这个缓存存在的意义就是避免同一种状态组合被反复创建。如果你在自研Pass里不小心每个DrawCall都传不一样的`FGraphicsPipelineStateInitializer`,性能会肉眼可见地雪崩。

Buffer和Texture方面,RHI统一用`FRHIBuffer`、`FRHITexture`做句柄。你真正创建的时候,走的是`FRHIResourceInfo`加各种`CreateBuffer`、`CreateTexture`接口。RHI层会根据资源Flag自动决定是否放在GPU显存、是否允许CPU读取,以及是否需要UAV(无序访问视图)。

Shader对象也是一样,`FRHIShader`是统一句柄,底层可能是`ID3D12ShaderBytecode`,也可能是`VkShaderModule`。你在材质编辑器里看见的HLSL代码,经过ShaderCompileWorker编译后,会生成平台相关的Shader Bytecode,然后再被包装成RHI Shader对象。

3.3 不同图形API后端的行为差异(D3D11 vs D3D12 vs Vulkan vs Metal)

RHI虽然做了抽象,但不代表各平台后端行为完全一致。差异主要集中在状态管理和资源屏障上。

D3D11是最“远古”的一类模型:Driver会自动处理大部分资源状态转换,PSO也不太需要显式创建,很多状态是动态设置的,所以写D3D11后端相对简单。但D3D11的CPU开销高,DrawCall一大就容易被Driver卡脖子。

D3D12和Vulkan是显式API,把内存管理、资源屏障、描述符堆这些都暴露给引擎层。RHI后端必须自己管理这些。UE5在D3D12后端做了一个很关键的抽象——`FD3D12DynamicRHI`,它在底层实现ResourceBarrier追踪,尽量把跨Pass的Barrier合并成批量调用,避免GPU频繁等待。

Metal 的行为类似D3D12,但它有自己的资源寿命追踪和着色器编译机制。Apple的Metal是支持离线编译的,UE5可以通过MetalShaderCompiler提前编译Shader,避免运行时编译造成的卡顿。

也正是因为D3D12和Vulkan是显式API,UE5在做多Pass渲染时会有意识地做状态批处理。比如同一个Pass里,如果两个MeshDrawCommand的PSO相同,就可以减少一次`SetPipelineState`调用。RHI层会通过`ValidateGraphicsPipelineState`等机制帮你做这部分优化,但你必须在绘制前正确初始化PSO,否则会被挡在“验证”之外。

4. 动手实践:在RHI层做断点、看数据和验证DrawCall

理论讲了这么多,不实际操作一遍等于白看。这一节我结合自己调试时的经验,整理几个最实用的RHI层观测手段。

4.1 常用调试开关与工具

RHI层不是黑盒,UE5提供了不少调试开关。我最常用的有这几个:

  • `r.RHICmdListDump\ = 1\:把RHI命令列表里面的命令全部打印出来,能看到每一帧执行了哪些`DrawIndexedPrimitive`、`SetGraphicsPipelineState`、`CopyTexture`等操作。
  • `r.RHIThread.Enable\ = 0\:关闭RHI线程,让渲染线程直接调用RHI,方便单步调试。注意这个开关在部分版本是启动项硬编码的,可能需要在命令行或`ConsoleVariables.ini`里设置。
  • `r.ShaderPipelineCache.Enabled\ = 0\:临时关闭PSO缓存,用于排查和PSO预编译相关的问题。
  • `r.D3D12.TargetNumCommandLists`、`r.D3D12.SubmitBatchHint`等:控制D3D12后端的命令列表数量与批次提交策略,能影响CPU提交开销。

外部工具方面,Windows上推荐RenderDoc加PIX。RenderDoc能抓Vulkan和D3D12的帧,PIX对D3D12的Debug和时序分析更强。Metal平台可以用Xcode自带的Metal Debugger。

4.2 在RHI层拦截图形API命令

如果你希望在代码里观察RHI命令的执行,有两个位置很关键。

第一个位置是`FDynamicRHI`类。它是所有平台RHI后端继承的基类,里面有很多虚函数对应用户态的RHI操作,比如`RHIDrawIndexedPrimitive`、`RHISetGraphicsPipelineState`。你可以在引擎源码里临时打断点,或者继承实现一个日志版后端,打印每次调用。这个方法适合“我要看某个DrawCall到底提交了什么参数”的场景。

第二个位置是命令列表的函数指针。FRHICommandList里存的是`FRHICommand`对象,每个命令对象内部有`Execute`方法。你可以在`FRHICommandListImmediate::ImmediateFlush`或者相关位置打断点,看命令提交时到底发生了什么。这个方法更适合排查“渲染线程卡住了”“命令迟迟没有提交”这类问题。

我自己的经验是:先用RenderDoc抓帧确认“这一帧有没有这个DrawCall”,再用r.RHICmdListDump确认“RHI层有没有收到这个DrawCall”。如果RenderDoc里没有,但Dump里有,说明底层API提交环节出问题了;如果Dump里就没有,那问题出现在RHI之前的场景遍历或MeshDrawCommand生成阶段。

4.3 通过r.RHICmdListDump看串行化后的命令流

r.RHICmdListDump的输出量非常大,一帧可能打印几十万行。我一般不会直接看全量输出,而是结合`Draw|DrawIndexed|Dispatch`这类关键字做过滤。

举个例子,我在排查一个自定义Pass是否被重复绘制时,做法是:

  1. 在ConsoleVariables.ini里设置`r.RHICmdListDump=1`。
  2. 找到要分析的帧输出,用文本编辑器定位到跟我的Pass名称相关的注释。
  3. 顺着注释往下看,确认这个Pass下有几条`DrawIndexedPrimitive`、每个DrawCall的Instance数量是多少。

注意,RHI Dump只显示已经被“提交”的命令。有些命令可能被延迟到后面批次才执行,所以排查时最好盯着真正调用底层API那一刻的输出,而不是命令被录制那一刻。

5. 从RHI层看UE5新特性:Nanite、Lumen对图形API的胃口

UE5宣传片里最吸引人的就是Nanite和Lumen。这两个东西在渲染架构上非常激进,但从RHI视角看,它们对底层API的依赖也很明显。

5.1 RHI如何暴露Mesh Shader与GPU Driven

Nanite的渲染路径本质上是一种GPU Driven的Cluster渲染方案。它不再把Mesh作为一个整体来画,而是把网格拆成很多Cluster,在GPU侧通过Compute Shader做剔除和LOD选择,最后用IndirectDraw或者类似机制来绘制。

这条路对图形API的要求很高。D3D12和Vulkan是可以承担的,因为可以支持StructuredBuffer做间接绘制参数、支持UAV写入剔除结果、支持ExecuteIndirect/DrawIndirect这类操作。D3D11和OpenGL则基本带不动Nanite,所以UE5直接在RHI层把老API后端的支持范围给限死了。

RHI为此暴露的接口包括:`DrawIndirect`、`DispatchIndirect`(在部分版本抽象为IndirectDrawing相关接口)、`CreateStructuredBuffer`、资源UAV等。如果你自己写GPU Driven管线,这些接口同样是你最常碰到的。

Lumen则依赖大量Radiance Cache和Screen Space追踪,这些操作大量使用Compute Shader、RWTexture、以及随时可能要读回或复制的数据。RHI层对UAV、拷贝资源、跨队列同步(比如CopyQueue和DirectQueue)的支持,直接决定Lumen能否在某个API上高效运行。

5.2 自研渲染特性时应沿用RHI还是直接调用API

这个问题我被人问过很多次。有些团队为了追求特定平台极致性能,会在UE里直接调用`ID3D12GraphicsCommandList`去画东西,绕开RHI。

我的建议是:原型阶段可以这么干,但正式功能尽量别。

原因有三。第一,RHI帮你处理了资源生命周期与线程安全,直接调API意味着你得自己保证资源在被释放前没有GPU访问冲突,这个坑特别容易引发随机崩溃。第二,RHI层做了跨平台统一,如果以后要出主机版本或者换API后端,直接调API的功能就是一颗定时炸弹。第三,UE5的渲染器很多假设是建立在RHI命令流顺序上的,你绕过它执行自己的API命令,很难保证状态一致。

当然,RHI接口也不是万能的。某些平台特有功能,比如特定硬件光追加速特性,如果RHI没有暴露,你只能通过扩展RHI后端或者用Platform-specific代码块去实现。这时候我建议把平台特定逻辑尽量隔离在RHI后端里,而不是堆在业务渲染代码里。

6. 常见问题与排查技巧实录

最后一部分,我把实际项目中遇到的跟RHI相关的问题整理成了一些实录,每个问题后面附上排查思路,希望对你有用。

6.1 RHI线程导致的黑屏与Crash

症状:游戏运行几秒到几分钟后随机黑屏崩溃,崩溃栈经常指向RHI线程,而且Release版比Debug版更容易复现。

这类问题最常见的原因是资源生命周期没有保证好。比如你在渲染线程创建了一个`FRHITexture`,但在游戏线程把它释放了;或者上传数据时还没等RHI命令执行完就把临时缓冲回收了。

排查时我会优先检查:

  • 自定义Pass里有没有直接创建引擎不管理的`FRHIBuffer`,是不是作用域结束就释放了。
  • `ENQUEUE_RENDER_COMMAND`里引用的资源是不是可能被外部提前清理。
  • 使用`FRHILockTexture`或`FRHILockBuffer`后,有没有保证在解锁前已经提交命令。

还有一种隐蔽情况:渲染线程和游戏线程同时访问同一个`FRHIResource`,没有加锁也没有用`FRHICommand`延后释放。遇到这种情况,可以开启`r.RHIThread.Enable=0`临时验证,如果关了RHI线程后问题消失,那多半是线程同步问题。

6.2 纹理格式映射问题

症状:某些贴图在D3D12下正常,在Vulkan下却出现花屏或者黑色块。

十有八九是纹理格式映射没对上。例如BC7压缩格式在少数移动平台驱动上支持很差,RHI会把BC7映射成没有压缩的格式,导致显存翻倍或采样出错。或者Srgb标记不一致,在某一端采样时认为纹理是Gamma空间,另一端认为不是,颜色就会出现偏差。

排查时先确认:

  • `r.Vulkan.EnableValidation`是否开启,观察Validation Layer有没有报格式相关错误。
  • 用RenderDoc对比同一帧在不同API下的纹理创建参数。
  • 检查你创建`FRHITexture`时填的`PF_XXX`格式是否在所有平台都被RHI支持。

6.3 Shader编译Worker与Fatal errors

症状:启动时随机弹出类似`Fatal error: [File:...ShaderCompileWorker...]`的窗口,然后编译进程挂掉。

这种情况通常跟ShaderCompilerWorker进程崩溃有关,原因是多线程编译时某个Shader变异体触发了编译器Bug,或者项目着色器数量太大导致进程内存爆掉。

我的处理步骤是:

  • 找到崩的Shader文件,单独编译一次,看是否稳定复现。
  • 在编译命令行里关闭并行编译,减少Worker数量,让编译器以更慢的模式运行。
  • 如果是内存问题,排除是不是有超大#include,或者用了太多模板组合导致单文件膨胀。

RHI层面跟这个相关的,主要是`FShaderResourceId`与PSO缓存。如果PSO缓存文件损坏,启动时也会出现奇怪的编译报错,可以通过删除`Saved`目录下的PSO缓存来排除。

6.4 性能剖析时的RHI开销识别

症状:帧率上不去,但GPU占用不高,Profiler显示RHI线程被占满。

这就说明CPU提交到GPU的命令太多或者太碎。看数据时重点关注RHI线程的`Draw`次数和`SetPipelineState`次数。如果我观察到DrawCall数量其实不多,但SetPipelineState频繁,那么问题多半出现在PSO切换上。反之,如果DrawCall很多且都是一些小Mesh,就需要考虑合批或实例化。

另外,D3D12后端的`Present`同步开销也很容易被忽略。如果RHI线程长时间卡在等待Present信号,说明缓冲帧数或者垂直同步配置有问题,可以尝试调整`r.OneFrameThreadLag`或交换链相关设置。

最后分享一个我的习惯:任何时候怀疑渲染层有问题,先摆RenderDoc或PIX抓帧,再开r.RHICmdListDump看命令流。如果Capture不到或者Dump为空,那说明在RHI之前就没生成MeshDrawCommand,问题不在GPU,而在场景遍历、剔除或者MeshDrawCommand烘焙阶段——这个判断能帮你省掉一大半排查时间。希望这条链路梳理得够清楚,你下次在改UE渲染底层、或者面对“RHI Error”一头雾水的时候,能少撞几次墙。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 4:10:01

语音通知接口对接实战:从资质审核到回调验签的完整避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/10 4:09:20

CANN/ge GEFinalize API文档

GEFinalize 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端…

作者头像 李华
网站建设 2026/9/10 4:08:49

CANN/ge图引擎错误信息获取接口

GEGetErrorMsg 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorFlow …

作者头像 李华
网站建设 2026/9/10 4:05:27

CANN/ge ES C++图构建API文档

Eager Style Graph Builder Class Relationship Documentation 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少…

作者头像 李华
网站建设 2026/9/10 4:01:50

GE图引擎UpdateOutputDesc API

UpdateOutputDesc 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorFl…

作者头像 李华