NV的shuffle渲染指令和GPU运行机制--Apple的学习笔记

今天在看ShuffleIntrinsicsVk和HelloVulkan工程的区别,从显示效果来看,比hellovulkan多了些选项,看上去是渲染效果不同而已。

一,问题

那么代码到底要改多少呢?带着问题我对比了工程。

  1. shader文件变了,引入了mode及一些glgs中我不清楚的变量和函数比如gl_SMIDNV和ballotThreadNV。
  2. 除了GUI添加了可选项,vulkan处理代码改动很少
    a,添加了VK_NV_GLSL_SHADER_EXTENSION_NAME的扩展支持。
    b,将一个pipeline改成pipeline队列。(因为有多种渲染,所以初始化时候需要配置多个pipeline)
    c, 添加了VkSpecializationInfo结构体。
    d,设置了pInheritanceInfo,即设置了辅助缓冲区,合并后一起提交,应该是为了性能,不影响功能,我改成nullptr也没区别。(可以忽略)

二,重点

从我对比工程来看,主要区别其实就是shader文件了。

1.SpecializationInfo参数理解

vulkan spec中SpecializationInfo参数是指向VkSpecializationInfo类型的变量的指针。 它允许在管线创建期间在运行时修改着色器源代码中定义的常量变量的值。
其实我理解就是多加了一个glsl的变量mode,然后通过switch case来选择不同的渲染效果。后来查看了help说明
"它允许为着色器指定常量值。使用单个着色器模块,通过为其中使用不同的常量值,可以在流水线创建时对行为进行配置。这比在渲染时使用变量配置着色器更有效率,因为编译器可以进行优化,例如消除if值判断的语句。如果没有这样的常量,可以将成员设置为nullptr,我们的struct结构体初始化自动进行。"
就是说他有优化的作用,因为GPU编程不希望看到很多判断条件,它会浪费线程。有了这个功能,那么就可以优化线程了。提高了性能。

2.VK_NV_GLSL_SHADER_EXTENSION_NAME的扩展支持

NV官网Reading Between The Threads: Shader Intrinsics 快速的看了一遍,没有理解。原因是它说使用warp shuffle和warp vote指令比使用共享内存快。那么这些指令在GPU哪里,是怎么运行的?我必须再系统的了解下GPU的结果及运行机制。

3.GPU的结构

GPU的硬件结构,也不是具体的硬件结构,就是与CUDA相关的几个概念:thread,block,grid,warp,sp,sm。
sp: 最基本的处理单元,streaming processor 最后具体的指令和任务都是在sp上处理的。GPU进行并行计算,也就是很多个sp同时做处理
sm:多个sp加上其他的一些资源组成一个sm, streaming multiprocessor. 其他资源也就是存储资源,共享内存,寄储器等。
warp:GPU执行程序时的调度单位,目前cuda的warp的大小为32,同在一个warp的线程,以不同数据资源执行相同的指令。
grid、block、thread:在利用cuda进行编程时,一个grid分为多个block,而一个block分为多个thread.其中任务划分到是否影响最后的执行效果。划分的依据是任务特性和GPU本身的硬件特性。

4.GPU的运行机制

系统的了解了GPU的部件及运行机制。


NV的shuffle渲染指令和GPU运行机制--Apple的学习笔记_第1张图片
GPU硬件结构.png

如上图,对于某些GPU(如Fermi部分型号)的单个SM,包含:
32个运算核心 (Core,也叫流处理器Stream Processor)
16个LD/ST(load/store)模块来加载和存储数据
4个SFU(Special function units)执行特殊数学运算(sin、cos、log等)
128KB寄存器(Register File)
64KB L1缓存
全局内存缓存(Uniform Cache)
纹理读取单元
纹理缓存(Texture Cache)
PolyMorph Engine:多边形引擎负责属性装配(attribute Setup)、顶点拉取(VertexFetch)、曲面细分、栅格化(这个模块可以理解专门处理顶点相关的东西)。
2个Warp Schedulers:这个模块负责warp调度,一个warp由32个线程组成,warp调度器的指令通过Dispatch Units送到Core执行。
指令缓存(Instruction Cache)
内部链接网络(Interconnect Network)

5. compute shaders的含义

Compute Shader 可以在通常的渲染管线之外运行,执行一些大量的通用计算,用途:大量并行少分支的数学运算很适合使用。
Compute Shader是一种技术,是微软DirectX 11 API新加入的特性,在Compute Shader的帮助下,程序员可直接将GPU作为并行处理器加以利用,GPU将不仅具有3D渲染能力,也具有其他的运算能力,也就是我们说的GPGPU的概念和物理加速运算。

6. 像素块

32个像素线程将被分成一组,或者说8个2x2的像素块,这是在像素着色器上面的最小工作单元,在这个像素线程内,如果没有被三角形覆盖就会被遮掩,SM中的warp调度器会管理像素着色器的任务。
也就是说,在像素着色器中,会将相邻的四个像素作为不可分隔的一组,送入同一个SM内4个不同的Core。

三,总结

要了解渲染,就必须了解GPU结构及GPU运行机制。NV有很多架构,比如图灵架构,最新的RTX光线追踪技术,我只是初步了解NV主流的GPU硬件架构及运行机制。
有了GPU基础后,我再阅读官网关于warp shuffle和warp vote的渲染指令,我现在理解它是GPU内部的引擎就像physx一样。它在GPU内部通过SM之间交换数据而达到某些渲染效果比如爆炸/水波纹效果,而不需要和memory模块交互数据,这样可以节约系统切换时间,从而提升效率。而所谓引擎也可以理解为驱动程序中的一部分,它提供了API接口,程序员编程只要直接使用开放的接口即可。所以代码中需要检测VK_NV_GLSL_SHADER_EXTENSION_NAME扩展是否支持。

四,参考资料

https://blog.csdn.net/asasasaababab/article/details/80447254
啊哈~我又进步了一点点。不积跬步无以至千里V

你可能感兴趣的:(NV的shuffle渲染指令和GPU运行机制--Apple的学习笔记)