GPU架构和渲染技术
![9db91f71e1ffde6c80f0989a5bed9148.webp](https://filescdn.proginn.com/872bb5aaa18d0cfe805c033eb21cabea/9db91f71e1ffde6c80f0989a5bed9148.webp)
GPU技术篇
- GPU分析:全球竞争格局与未来发展
- 2023年GPU显卡技术词条报告
- 英伟达GPU龙头稳固,国内逐步追赶(详解)
- GPU/CPU领域散热工艺的发展与路径演绎
- 探析ARM第五代GPU架构
- 新型GPU云桌面发展白皮书
- 十大国产GPU产品及规格概述
- GPU平台生态:英伟达CUDA和AMD ROCm对比分析
- GPU竞争壁垒:微架构和平台生态
- GPU微架构、性能指标、场景、生态链及竞争格局(2023)
- 大模型训练,绕不开GPU和英伟达
- Nvidia/AMD竞争:GPU架构创新和新兴领域前瞻探索
- 走进芯时代:AI算力GPU行业深度报告
- 独立GPU市场,AMD份额大跌?
- CPU渲染和GPU渲染优劣分析
- NVIDIA Hopper GPU:芯片三围、架构、成本和性能分析
- 国内GPU厂商及细分行业前景(2023)
- ChatGPT对GPU算力的需求测算与分析
- AMD RDNA2 GPU架构详解
- GPU研究框架(2023)
GPU架构 GPU概括来讲,就是由显存和许多计算单元组成。 显存(Global Memory)主要指的是在GPU主板上的DRAM,类似于CPU的内存,特点是容量大但是速度慢,CPU和GPU都可以访问。 计算单元通常是指SM(Stream Multiprocessor,流多处理器),这些SM在不同的显卡上组织方式还不太一样。作为执行计算的单元,其内部还有自己的控制模块、寄存器、缓存、指令流水线等部件。
计算单元
下面是Maxwell架构图和Turing架构图。
![5dbe0a9088906f4ad7aed014768d76be.webp](https://filescdn.proginn.com/605a35e9a774660d494d8d934ddbcdaa/5dbe0a9088906f4ad7aed014768d76be.webp)
![de1c34f2351f6131046f372c3e1178e3.webp](https://filescdn.proginn.com/76acaaf95d84c3014390986a5578b094/de1c34f2351f6131046f372c3e1178e3.webp)
补充:GPC里除了有SM还有一些其它的部件,比如光栅化引擎(Raster Engine)。另外,连接每个GPC靠的是Crossbar,例如某一个GPC计算完的数据需要另外GPC来处理,这个分配就是靠的Crossbar。这里的SM就是本章节所说的计算单元,同时需要知道的是,程序员平时写的Shader就是在SM上进行处理的。
SM(Stream Multiprocessor,流多处理器)
不同GPU厂商的架构中,SM的叫法不尽相同。-
• 高通称作Streaming Processor / Shder Processor。
-
• Mali称作Shader Core。
-
• PowerVR称作Unified Shading Cluster,通常简称为Shading Cluster或USC。
-
• ATI/OpenCL称作Compute Unit,通常简称为CU。
![1cb492ffe0e6bda8c0871592508749a6.webp](https://filescdn.proginn.com/8db4f81d537806305c0c7266c0dbdbae/1cb492ffe0e6bda8c0871592508749a6.webp)
-
• PolyMorph Engine:多边形变形引擎。负责处理和多边形顶点相关的工作,包括以下模块。
-
• Vertex Fetch模块:顶点处理前期的通过三角形索引取出三角形数据。
-
• Tesselator模块:对应着DX11引入的新特性曲面细分。
-
• Stream Output模块:对应着DX10引入的新特性Stream Output。
-
• Viewport Transform模块:对应着顶点的视口变换,三角形会被裁剪准备栅格化。
-
• Attribute Setup模块:负责顶点的插值运算并输出给后续像素处理阶段使用。
-
• Core:运算核心,也叫流处理器(SP——Stream Processor)。每个SM由32个运算核心组成。由Warp Scheduler调度,接收Dispatch Units的指令并执行,下面会详细介绍。
-
• Warp Schedulers:Warp调度模块。Warp的概念其实就是一组线程,通常由32个线程组成,对应着32个运算核心。Warp调度器的指令通过Dispatch Units送到运算核心(Core)执行。
-
• Instruction Cache:指令缓存。存放将要执行的指令,通过Dispatch Units填装到每个运算核心(Core)进行运算。
-
• SFU:特殊函数单元(Special function units)。与Adreno GPU中的初等函数单元(Elementary Function Unit,EFU)类似,执行特殊数学运算。由于其数量少,在高级数学函数使用较多时有明显瓶颈。特殊函数例如以下几类。
-
• 幂函数:pow(x, a)、sqrt(x)。
-
• 对数函数:log(x)、log2(x)。
-
• 三角函数:sin(x)、cos(x)、tan(x)。
-
• 反三角函数:asin(x)、acos(x)、atan(x)。
-
• LD/ST:加载/存储模块(Load/Store)。辅助一个Warp(线程组)从Share Memory或显存加载(Load)或存储(Store)数据。
-
• Register File:寄存器堆。存放将要处理的数据。
-
• L1 Cache:L1缓存。不同GPU架构不一样,有些L1缓存和Shared Memory共用,有的L1缓存和Texture Cache共用。
-
• Uniform Cache:全局统一内存缓存。
-
• Tex Unit和Texture Cache:纹理读取单元和纹理缓存。Fermi有4个Texture Units,每个Texture Unit在一个运算周期最多可取4个采样器,这时刚好喂给一个线程束(Warp)(的16个车道),每个Texture Uint有16K的Texture Cache,并且在往下有L2 Cache的支持。
-
• Interconnect Network:内部链接网络。
-
-
GPU内存架构
![3efb81e64895e2a3234972c1925c4d5f.webp](https://filescdn.proginn.com/b7020343baa14de37b657718580ba775/3efb81e64895e2a3234972c1925c4d5f.webp)
存储类型 | 访问周期 |
寄存器 | 1 |
共享内存 | 1~32 |
L1缓存 | 1~32 |
L2缓存 | 32~64 |
纹理、常量缓存 | 400~600 |
全局内存 | 400~600 |
应用阶段
这个阶段主要是CPU在准备数据,包括图元数据、渲染状态等,并将数据传给GPU的过程。如下图所示就是数据如何进入GPU处理的过程。
![c03b45931ece3cb41799d02845d0f212.webp](https://filescdn.proginn.com/ab9ba8d52d2abd076e35bb5ae0ea79a5/c03b45931ece3cb41799d02845d0f212.webp)
![f8a83586f4ffb82750537093346d659c.webp](https://filescdn.proginn.com/d1c03eb5594193a2b625dde1e4723514/f8a83586f4ffb82750537093346d659c.webp)
图元装配器(Primitive Distributor)根据图元类型、顶点索引以及图元装配命令,开始分配渲染工作,并发送给多个GPC处理。
顶点处理 PolyMorph Engine的Vertex Fetch模块通过三角形索引,将数据从显存中取得三角形数据,传入SM寄存器中。 前文说过Shader就是在SM上进行处理的。熟悉Shader开发的人都知道,Shader会对不同的“语义”进行处理,这些语义也叫“寄存器”。Shader中使用到的寄存器不光这些“语义”的寄存器,它们分为很多种类型,包括输入寄存器、常量寄存器、临时寄存器等。 |
Shader Model 2.0/2.X | Shader Model 3.0 | Shader Model 4.0 |
临时寄存器 | ≥12 | 32 | 4096 |
VS常量寄存器 | ≥256 | ≥256 | 14×4096 |
PS常量寄存器 | 32 | 224 | 14×4096 |
VS纹理 | None | 4 | 128×512 |
PS纹理 | 16 | 16 | 128×512 |
VS输入寄存器 | 16 | 16 | 16 |
插值寄存器 | 8 | 10 | 16/32 |
PS输出寄存器 | 4 | 4 | 8 |
![f2489d6ca8b12bfb5b59ddceef6bf6eb.webp](https://filescdn.proginn.com/01cb8f37853cf6424bd70f2710eee45c/f2489d6ca8b12bfb5b59ddceef6bf6eb.webp)
统一着色器架构
Shader Model 在诞生之初就为我们提供了Pixel Shader(顶点着色器)和Vertex Shader(像素着色器)两种具体的硬件逻辑,它们是互相分置彼此不干涉的。 但是在长期的开发过程中,发现了以下的问题。-
• 如果一个场景包含的三角形相当细碎,那么这个为了渲染这个场景,顶点着色器的处理单元就会负载很高,但是会有很大一部分像素着色器的处理单元闲置。
-
• 如果一个场景仅包含一个大的三角形,而且这个大三角形覆盖了大部分的屏幕像素且运算很复杂,那么像素着色器的处理单元就会负载很高,但是会有一大部分顶点着色器的处理单元闲置。
![c468fef0ba4fa4b12b127f564d2f443b.webp](https://filescdn.proginn.com/b85d99a205bab9d2c667eaa8eb9f5c55/c468fef0ba4fa4b12b127f564d2f443b.webp)
SIMT
前文提到指令(Instruction)会经过调度单元(Dispatch Unit)的调度,分配到每一个运算核心去执行。 那么,指令是什么呢?其实指令可以理解为一条一条的操作命令,也就是告诉运算核心要怎么做的“描述语句”。比如 “将tmp25号寄存器里的值加上tmp26号寄存器里的值,得到的值存入tmp27号寄存器”这种操作,就是一条指令。 调度单元这里分配给每一个运行核心去执行的指令其实都是相同的。也就是说调度单元(Dispatch Unit)让每个运算核心在同一刻干的事情都是一样的。每一个运算核心虽然同一时刻做的操作是一样的,但是它们所操作的数据各自都是不同的。 举个例子,还是上面的这条指令——“将tmp25号寄存器里的值加上tmp26号寄存器里的值,得到的值存入tmp27号寄存器”。对于A运算核心和B运算核心来说,它们各自的tmp25号、tmp26号寄存器里存的值都是不一样的,以下为两个核心可能出现情况的例子。-
• 对于A运算核心来说,tmp25号存了“2”,tmp26号存了“3”,最终计算后写入tmp27号寄存器的数是“5”。
-
• 对于B运算核心来说,tmp25号存了“8”,tmp26号存了“12”,最终计算后写入tmp27号寄存器的数是“20”。
线程束
每个SM包含了很多寄存器,每个Shader核心函数(VS/GS/PS等)会当作一个线程去执行。Shader经过编译后,可以明确知道要执行的核心函数需要多少个寄存器,也就是说每个线程需要多少个寄存器是明确的。当线程要执行时,会从寄存器堆上分配得到这个线程需要数目的寄存器。比如一个SM总共有32768个寄存器,如果一个线程需要256个寄存器,那么这个SM上总共可以执行32768/256=128个线程。 SM上每一个运算核心同一时间内执行一个线程,也就是说一个线程其实是对应一个运算核心,但是,一个运算核心却是对应多个线程。这该怎么理解呢? 上文说到Shader所需要的寄存器数量决定了SM上总共能执行多少个线程。一个SM上总共也就有32个运算核心,但是如果多于32个线程需要执行怎么办? 线程调度器会将所有线程分为若干个组,每一个组叫做一个线程束(Warp),它又包含了32个线程。因此如果一个SM总共有32768个寄存器,这个SM总共可以执行128线程,那么这个SM上总共可以分配128/32=4个线程束。 一个运算核心同一时间只能处理一个线程,一组(32个)运算核心同一时间只能处理一个线程束,而线程束中有些指令处理起来会比较费时间,特别是内存加载。每当当前线程束(Warp)遇到费时操作,它就会被阻塞(Stall)。为了降低延迟,GPU的线程调度器会采用一种简单而有效的策略,就是切换另一组线程来运行。 运算核心在多个线程束(Warp)间切换着执行,最大化利用运算资源,也就解释了上文中所描述的线程和运算核心之间的关系了。 下图展示了一个SM执行三个线程束的例子。例子中一个线程束只有4个线程是一种简化图形的表示方式,根据上文可知,其实一个线程束中的线程数远大于4。下图中的txr指令延迟会比较高,所以容易使线程阻塞(Stall)。![58c9353c66350b10782394ad9eb9bfcf.webp](https://filescdn.proginn.com/5f212300f5299aac9f8c86f76f5db1eb/58c9353c66350b10782394ad9eb9bfcf.webp)
由于线程束的机制,可以推出以下结论。由于寄存器堆的寄存器数量是固定的,如果一个Shader需要的寄存器数量越多,也就是每个线程分配到的寄存数量越多,那么线程束数量就越少。线程束少,供线程调度器调度的资源就少,当遇到耗时指令时,由于没有更多线程束去灵活调配,所有线程就只能死等,不利于资源的充分利用,最终导致执行效率低下。
裁剪空间当Warp完成了VS的所有指令运算,就会被PolyMorph Engine的Viewport Transform模块处理,并将三角形数据存放到L1和L2缓存里面。此时的三角形会被变换到裁剪空间(Clip空间),在这个空间下的顶点为像素处理阶段做好了准备。
像素处理 为了平衡光栅化的负载压力,WDC(Work Distribution Crossbar)会根据一定策略,将屏幕划分成多个区域块,并重新分配给每一个GPC。下图为WDC为屏幕划分区域块的示意图。![7fc93156474887b342003f94cffa3b91.webp](https://filescdn.proginn.com/687d51d9ff021a40b974e709bba34285/7fc93156474887b342003f94cffa3b91.webp)
图中有32个亮度色阶也就说明有32个不同编号的SM,由渲染结果可以看到SM的划分并不是按编号顺序简单地依次划分的。另外根据上图可见,同一个色块内的像素分属不同三角形,就会分给不同的SM进行处理。如果三角形越细碎,分配SM的次数就会越多。
![cf022b0c9aef2ddd6d473747b3dedf60.webp](https://filescdn.proginn.com/d9df35ed090748d51d47f5213cf7b438/cf022b0c9aef2ddd6d473747b3dedf60.webp)
// warp id
float lightness = gl\_WarpIDNV / gl\_WarpsPerSMNV;
FragColor = vec4(lightness);
渲染画面如下图所示。
![16a48c31aa2433e8bc8332cb41479b81.webp](https://filescdn.proginn.com/5defb02bbd7f6ea6fe7417e0f2dd9d8e/16a48c31aa2433e8bc8332cb41479b81.webp)
由于一个色块是由4×8个像素组成,也就证明了一个Warp包含了32个线程。
输出到渲染目标 经过PS计算,SM将数据转交给Crossbar,让它分配给ROP(渲染输出单元)。像素在这里进行深度测试以及帧缓冲混合等处理,并将最终值写入到一块FrameBuffer里面,这块FB就是双缓冲技术里面的后备缓冲。最终将FB写入到显存(DRAM)里。
多平台渲染架构
关于IMR、TBR、TBDR介绍的文章有很多,下面简单归纳一下。
IMR
IMR架构主要是PC上GPU采用的渲染架构,这个架构主要是渲染快、带宽消耗大。 特点:-
• 每一个Drawcall按顺序、连续地执行完成。每一个Drawcall从VS、PS到最终写入FrameBuffer中的颜色缓冲、深度缓冲,中间没有打断。
-
• FrameBuffer可以被多次访问。也就是说每个Drawcall的每像素渲染都会直接写入FrameBuffer。
-
• 每个像素频繁访问显存上的FrameBuffer,带宽消耗大。
![bc169059495741361ff743f9069d6e88.webp](https://filescdn.proginn.com/cea4212dacdc3f8e97692fcde0ee6059/bc169059495741361ff743f9069d6e88.webp)
for (draw in renderPass)
{
for (primitive in draw)
{
execute\_vertex\_shader(vertex);
}
if (primitive is culled)
break;
for (fragment in primitive)
{
execute\_fragment\_shader(fragment);
}
}
问题:
-
• 发热量大。主要是带宽消耗大导致的,这个在PC上没有太大问题。
-
• 耗电量大。主要是带宽消耗大导致的,这个在PC上没有太大问题。
-
• 芯片大小大。这个在PC上没有太大问题,为了优化带宽会有L1 Cache和L2 Cache,所以芯片会变大。
TBR
TBR全称Tile-Based Rendering,是一种基于分块的渲染架构。 分析:-
• 发热、费电,移动设备接受不了。
-
• 芯片太大,移动设备接受不了。
-
• 每一个Drawcall执行时仅仅经过分块(Tiling)和顶点计算,存入FrameData。“合适”的时机(如Flush、clear)进行Early-Z、着色、各种测试,最终一次性写入FrameBuffer中的颜色缓冲、深度缓冲,中间过程是不连续。
-
• FrameBuffer访问次数很少,FrameData会被频繁访问。
-
• 由于分块(Tile)的颜色缓冲和深度缓冲会放到On Chip Memory上,Early-Z和Z-Test都在这上面进行,节省带宽。
![4ae02535c7853dea62157f9a528adf3f.webp](https://filescdn.proginn.com/2b3de2f67858111274a5bfeeb9a673cf/4ae02535c7853dea62157f9a528adf3f.webp)
TBDR
TBDR全称Tile-Base-Deffered Rendering,是一种基于分块的延迟渲染架构。 分析:-
• Early-Z可以很好的降低Overdraw,但是TBR依赖物体绘制顺序。如果物体循环遮挡,无法完美地做到降低Overdraw。
相关渲染优化
寄存器充分使用
前文提到过,如果寄存器使用过多,会导致Warp数量变少,使得GPU遇到耗时操作的时候没有空闲Warp去调度,不利于GPU的充分利用,因此要节约使用寄存器。 对于Shader的语义也好,寄存器也好,都是作为矢量存在的。对于GPU的ALU来说,一条指令可以处理的数据一般是四维(4D)的,这就是SIMD(Single Instruction Multiple Data),类似的SIMD指令可以参考SSE指令集。 例如下面的代码。 float4 c = a + b;
如果没有SIMD处理单元,汇编伪代码如下,四个数据需要四个指令周期才能完成。
ADD c.x, a.x, b.x
ADD c.y, a.y, b.y
ADD c.z, a.z, b.z
ADD c.w, a.w, b.w
而使用SIMD处理后就变为一条指令处理四个数据了,大大提高了处理效率。
SIMD_ADD c, a, b
由于SIMD的特性,寄存器要尽可能完全利用。例如Unity里有一个宏用来缩放并且偏移图片采样用的UV坐标——TRANSFORM_TEX。按道理缩放UV需要乘以一个二维向量,偏移UV也需要加一个二维向量,这里应该是需要两个寄存器的。然而Unity将两个二维向量都装入同一个四维向量里面(xy为缩放,zw为偏移),这样就只用到一个寄存器了。总而言之,要充分利用寄存器向量的每一个分量。其定义如下。
// Transforms 2D UV by scale/bias property
#define TRANSFORM\_TEX(tex,name) (tex.xy \* name##\_ST.xy + name##\_ST.zw)
为了充分利用SIMD运算单元,GPU还提供了一种叫做co-issue的技术来优化代码。例如下图,由于float数量的不同,ALU利用率从100%依次下降为75%、50%、25%。
![add4a0fdc3dd537a7721fff4e5344ce2.webp](https://filescdn.proginn.com/1e4dce232d3f4096978027f820b51bb8/add4a0fdc3dd537a7721fff4e5344ce2.webp)
![96f1bec14b752651184c4eb72e58ce95.webp](https://filescdn.proginn.com/f9116c9e1d3f50ce8dff39e5f0e9f4e1/96f1bec14b752651184c4eb72e58ce95.webp)
![536448cdd8abde0fc25aef5b2178261e.webp](https://filescdn.proginn.com/b6f40b6d212b0c71549f9c19ed2067ab/536448cdd8abde0fc25aef5b2178261e.webp)
逻辑控制语句 GPU和CPU由于其设计目标就有很大的区别,于是出现了非常不同的架构。
![cbdf3b1ebbf1d6110d37a86e5e211a08.webp](https://filescdn.proginn.com/4dde202801f8603235e79caaa5078060/cbdf3b1ebbf1d6110d37a86e5e211a08.webp)
CPU - 分支预测
有人在JVM上做过一个测试。如果有一个有序数组,和一个同样大的无序数组,分别取出一百万次其数组中大于128的数字之和,消耗的时间是否相同呢? long long sum = 0;
for (unsigned i = 0; i < 1000000; ++i)
{
for (unsigned c = 0; c < arraySize; ++c)
{
if (data[c] >= 128)
sum += data[c];
}
}
以上这段代码,按实验步骤来做。
-
• 第一次data数组是个无序数组,消耗时间为18.7739秒,sum = 312426300000。
-
• 第二次data数组事先给排好序,消耗时间是5.69566秒,sum = 312426300000。
-
1. fetch(获取指令)
-
2. decode(解码指令)
-
3. execute(执行指令)
-
4. write-back(写回数据)
![294f2e83e89a0bb1a2be85cf34395e63.webp](https://filescdn.proginn.com/3da1c62b70ba9207dd1dd4ed55ba9245/294f2e83e89a0bb1a2be85cf34395e63.webp)
![91528da88de467e93f89d78120b35473.webp](https://filescdn.proginn.com/11a16adc16f79499b77b3869a50607c5/91528da88de467e93f89d78120b35473.webp)
GPU - 遮掩
GPU讲究的是大规模并行计算,没有那么强大的逻辑控制,所以GPU也不会去做分支预测。那么GPU是怎么去处理条件分支判断的呢? 由于GPU的执行是以lock-step的方式锁步执行的,也就是每一个运算核心一定要执行完当前指令的所有步骤才能执行下一条指令,也就是前文中所说的“比较笨一点的办法”,所以GPU是没有分支预测的。但是GPU有一个特殊的机制叫做遮掩(mask out)。![6a66b1c7c68c54b47be40ea90aca7d76.webp](https://filescdn.proginn.com/ca1d1848bfb9525482b9bfcd13d3c1e5/6a66b1c7c68c54b47be40ea90aca7d76.webp)
减少调用费时指令
通常一些需要从缓存里,甚至内存里读取数据的操作会比较费时,例如贴图采样的指令。 从上文中可以了解到,一般GPU架构里SFU这种处理单元比较少,因此特殊数学函数尽量少调用,例如pow、sin、cos等。移动渲染架构的优化
及时clear或者discard
由于TB(D)R架构下数据会一直积攒到FrameData里,直到“合适”的时机才会清空。如果一直不调用clear指令就会一直将数据积累到FrameData里清不掉。如果不用RenderTexture了就及时Discard掉。 例如有一张RenderTexture,渲染之前调用clear就能清空前一次的FrameData,不用这张RenderTexture了,就及时调用Discard(),以提高性能。不要频繁切换RenderTexture
频繁切换RenderTexture会导致频繁将Tile数据拷贝到FrameBuffer上,增加性能消耗。Early-Z
Early-Z可以很好的降低Overdraw,但是某些操作会使Early-Z失效。-
• Alpha Test / Clip / discard:需要执行完 PS 后,才能确定该像素深度是否被写入。
-
• 手动修改GPU插值得到的深度。
-
• 开启透明混合(AlphaBlend)。
-
• 关闭深度测试。
特别说明:因为Early-Z是通过深度去屏蔽不透明物体的,如果透明物体(Alpha Blend)或者挖洞的物体(Alpha Test)通过深度测试屏蔽了背景的不透明(Opaque)物体,那么背景就会镂空,看到clear指令指定的固有色,就会出现渲染错误,因此无论IMR还是T(D)BR的Early-Z都会受Alpha Test影响。因此要做到以下几点。
-
• 渲染物体时,渲染程序要按“Opaque → AlphaTest → AlphaBlend”的顺序渲染物体。
-
• 由于一般来说地形覆盖面积最大,“Opaque”的内部可以按“其他不透明物件 → 地形”的顺序渲染,最大化利用Early-Z优化Overdraw。
-
• 无论PowerVR还是Mali/Adreno芯片,AlphaTest都会影响性能,尽量少使用AlphaTest技术。
-
• 不支持Early-Z的硬件,可以适当使用PreDepathPass多渲染一遍图元来优化Overdraw,但是会增加顶点绘制的负担,需要权衡。
避免大量drawcall和顶点数
FrameData里会储存当前帧变换过的图元列表,也就是顶点数据,FrameData数据会随着Drawcall数增加而增加,FrameData增大有可能会存储到其他地方,影响读写速度,因此在移动平台渲染上百万个顶点或者三四百Drawcall就比较吃力了。 总结 本文主要归纳了GPU内部的一些基本单元及其作用,简单总结了一下对渲染架构的描述,并针对以上两方面介绍了一些优化性能的技巧。本文更多是归纳总结性质的,如果要更加深入的了解可以细读以下参考文章,如果有总结不到位的欢迎探讨。 参考《GPU Fundamentals》[2]
《Life of a triangle - NVIDIA's logical pipeline》[3](翻译[4]) 《深入GPU硬件架构及运行机制》[5] 《CPU 的分支预测》[6] 《移动端GPU——渲染流程》[7] 《剖析虚幻渲染体系(12)- 移动端专题Part 2(GPU架构和机制)》[8] 《针对移动端TBDR架构GPU特性的渲染优化》[9] 《Unity 着色器中"discard"操作符的问题》[10] 《移动平台GPU硬件学习与理解》[11] 《图形 3.4+3.5 正向渲染/延迟渲染 和 深度测试Early-z / Z-prepass(Z-buffer)》[12]
计算机专题:鸿蒙生态加速发展 2024年人形机器人专题策略:量产渐行渐近,未来不远 供需端双击推进AI PC产业发展(2024) 2024年 AI智算产业趋势展望 2024 AIGC 应用层十大趋势白皮书 FMS 2023闪存峰会:CXL技术篇(1) FMS 2023闪存峰会:CXL技术篇(2) FMS 2023闪存峰会:CXL技术篇(3) FMS 2023闪存峰会:UCIe和PCIe技术篇 FMS 2023闪存峰会:NVMe技术篇(1) FMS 2023闪存峰会:NVMe技术篇(2) FMS 2023闪存峰会:DDR/DRAM技术篇 《HotChips 2023及历年技术合集(汇总)》 1、HotChips 2023:开场闭幕总结 2、HotChips 2023:FPGAs技术专题 3、HotChips 2023:芯片互联技术专题 4、HotChips 2023:ML训练/推理技术专题 5、HotChips 2023:ML技术专题 6、HotChips 2023:CPU技术专题(1) 7、HotChips 2023:CPU技术专题(2) 8、HotChips 2023:UCIe技术专题 9、HotChips 2023:关键技术总结合集 10、HotChips历年技术合集
本号资料全部上传至知识星球,更多内容请登录智能计算芯知识(知识星球)星球下载全部资料。
免责申明: 本号聚焦相关技术分享,内容观点不代表本号立场,可追溯内容均注明来源,发布文章若存在版权等问题,请留言联系删除,谢谢。
温馨提示:
请搜索“AI_Architect”或“扫码”关注公众号实时掌握深度技术分享,点击“阅读原文”获取更多原创技术干货。