本文共 1442 字,大约阅读时间需要 4 分钟。
单指令单数据(SISD)与单指令多数据(SIMD)的主要区别在于数据访问方式。SISD的CPU在执行加法指令时,会依次访问内存,分别获取两个操作数后再进行求和运算。而SIMD型的CPU能够同时访问多个数据,通过多个执行单元一次性处理所有运算任务。
在GPU中,thread是用于执行着色器程序的基本单元。与CPU的thread不同,GPU的thread包含内存空间,用于存储输入数据和执行所需的寄存器。多个thread如果执行相同的着色器程序,就被称为warp(NVIDIA术语)。例如,常见的warp大小为32个thread。
当warp需要从内存读取数据时,所有thread会暂停执行,等待读取完成。这种情况下,系统会切换到其他warp继续执行,因为不同warp之间没有数据交互,切换不会消耗时间。
着色器程序的结构对效率有直接影响。寄存器数量有限,过多的thread需求会减少warp数量,导致GPU在拥塞时无法切换warp。动态分支(thread divergence)也会影响性能,因为不同thread可能执行不同的指令。
渲染管线中的可编程部分包括顶点着色器、细分、几何着色器和片元着色器。细分和几何着色器在某些GPU中不可选,例如移动设备。不可编程的部分包括裁剪和光栅化。
stream output用于将顶点数据以有序数组形式输出到stream中,供CPU或GPU使用。该阶段支持物理模拟,但输出的数据仅为浮点型,需要注意内存消耗。
GPU通过原子单元来避免数据竞争问题,但原子操作可能导致warp拥塞。需要确保多个着色器程序不同时修改同一内存区域。
early-z算法在片元着色器执行前进行深度测试,避免无效计算。这样可以节省资源,提高性能。
着色器程序的结构和动态分支对SIMD执行效率有重要影响。过多的thread需求会减少warp数量,增加GPU等待时间。
渲染管线按顺序包括顶点着色器、细分、几何着色器、裁剪、屏幕映射、光栅化、三角形准备与遍历、片元着色器和合并。可编程部分为顶点着色器、细分、几何着色器和片元着色器。
着色器虚拟机(HLSL)被编译为中间语言(IL),驱动将IL转换为GPU特定指令集。虚拟机支持不同的寄存器类型,包括uniform输入、varying输入和临时寄存器。
Tessellation Stage包括控制器、生成器和评估器。控制器和生成器处理输入数据,生成器输出顶点,评估器验证域的完整性。
MRT允许片元着色器输出到多个缓冲区,每个缓冲区称为render target。这种机制有助于处理多层渲染和特定效果,如阴影和渐变。
GPU的内存访问是并行的,warp中的所有thread会暂停等待数据。这种设计使得GPU在处理复杂计算时效率很高,但也带来了一定的控制挑战。
转载地址:http://jfuh.baihongyu.com/