Vulkan学习曲线非常陡峭? 为啥? 要明白最基本的出发点,Vulkan 几乎95%特性是AMD GCN之后的GPU硬件的面向对象封装,Vulkan的所有概念都是直接从硬件抽象出来的,给大家据一些例子,例如
1、Command Queue,分为Graphics, Compute, Transfer, Coder,这些Command Queue通过Event组成有向无环图。这四种类型的Command Queue对应四个不同硬件IP。
2、Command Buffer和Secodary Command Buffer, Indirect Buffer也是对硬件的封装。
3、Bindless Texture也是GCN最重要的概念,就是所有的Buffer(Constant, Vertex, Index), Texture都是可以通过加载常量描述符的方式,从而获得最大的编程性,其他公司的Descriptor Set都有一个限制,很多公司的Shader可能只能支持128 texture, GCN架构的通用计算能力最强,它没有限制,能够加载2^32-1个Textures!
4、Texture,被分为Linear, Tiled,硬件都是用Tiled方式来提高Cache Hit Rate,最大化利用Cache利用率,每家公司的Tile算法不完全一样。Linear方式用CPU方式的方式比较容易统一。同时Tiled一般都带有无损压缩和有损压缩,因此如果想用image_store, image_atomic只能用Linear Mode。
5、同步时比较难理解的,分为硬件不同IP之间的同步,CPU与GPU数据Copy,还有Pipeline的不同 Stages。本质是什么? 就是硬件执行任何一个功能,可以抽象为 foo(p,a,b); p是前置条件, a是输入数据,b是输出数据;硬件这么多同步要做到 while(p!=true);同时a没有任何脏数据?怎么才能没有脏数据?需要靠memory access的同步,就是GPU的各种Cache(constant, Instruction, Buffer, Texture, Depth/Stencil/Cache, PageTable, Context Register)。
6、那么多 Shader Stages,同时硬件又有200-300个不同的 Cache,因此Memory Access,通俗地理解为汽车的并行生产线工人必须同步,否则出厂的车灯不工作,左右轮胎不一致,就出错了。
7、Validation就是对生产线做调试验收的。
8、Vulkan 最奇怪的Pipeline就是可以没有Depth/Stencil/Color,然后把Pixel Shader当作 Compute Shader用。
9、另外一个比较难理解的是各种Shader Features,SubGroup,Shuffle等操作,这些都是从GPGPU概念保留过来的。
10、另外一些小众Feature, PUSHConstants16,PUSHConstants8, 都是为了某个特定性能优化问题而加的硬件特性,实际上很难用,低精度问题,一旦出来BUG,调试效率非常低。不建议使用。
11、HDR特性是最近几年,不断增加, 10BITS, 12BITS。
12、简单总结: Vulkan来源于AMD GCN硬件做面向对象抽象的结果,从硬件体系结构,特别是GPU硬件的5大IP( GPU, DMA, GPGPU, Video Codec, Command Queue),多IP之间同步,以及Grapics Pipeline + Cache ( Constant, Instruciton, Texture/Buffer, Index, Depth/Stencil, Color)同步问题,能够理解这些API的目标,从API到解决实际应用问题。
13、Small Tips:
1)厂家extensions尽量避免使用。
2)mobile GPU尽量不要用Shared Memory , Atomic这些操作,这种性能都是噩梦的;
3) mobile GPU通常不支持64Bits运算;
3)开发初期尽量不要使用16bits/8Bits运算,低精度出错Debug,哭干眼泪都没用。