高通吧 关注:170,083贴子:4,036,578
  • 38回复贴,共1

Dynamic Caching的解释???

只看楼主收藏回复

关于dynamic cache目前听到的解释都是什么prefetch与动态分配vram。从gpu操作层面来看整理显存碎片也不应该是硬件的事情,在次世代图形api之前是驱动管理的,次世代api之后甚至支持开发者自己控制,所以对于自动分配vram这个理论个人感觉有点相悖。prefetch就更是无从谈起了,毕竟GPU的理念是简单的控制没有分支预测与数据转发。
首先apple的视频里提到编译器离线统计根据需求最高的单个任务的资源量分配的资源大小。这是个什么意思呢?就得从gpu的执行模型来讲起了。
GPU的设计本质上是一个基于SIMT架构的大规模并行计算系统,它拥有成千上万的物理线程。然而,这些线程并不是单独启动的,而是以组为单位进行分配和执行。例如,NVIDIA的执行单元是SM,每个SM可以支持最多48个线程组,每组包含32个线程。AMD使用WGP,每个WGP支持最多64组/32线程或者32组/64线程。Apple则是每个核心支持最多3072组,每组32线程。
线程的执行数量之所以可以是物理线程数的数十倍,是因为GPU在面对高延迟时通过线程切换来掩盖这一延迟。当某个线程组执行的指令需要从显存中加载纹理时会发生阻塞,这时SM会切换到其他未阻塞的线程组继续执行任务。SM在具体执行时能够容纳的线程组数量被称为Occupancy,这一指标主要受每个线程的寄存器使用量影响。寄存器资源是有限的,这决定了同时执行的线程组的数量。
假设一个SM有64K的寄存器大小,如果某个任务的着色器在优化前需要4KB的寄存器,并被分为32个线程组来处理,那么由于寄存器的限制,它可能只能同时调度两组共32个线程(每组16线程)。优化后,如果只需要2KB寄存器,那么32个线程组就可以在同一处理块内完成任务,从而提高了总体时钟周期内完成任务的数量,增加了吞吐量和执行效率。
在任务派发上,优化线程数量的对齐至关重要,通过优化寄存器使用、任务划分的粒度以及减少非统一分支来实现。举例来说,如果一个任务需要48个线程,它将需要两个线程组,一个满载32线程,另一个只能使用16线程,这样就会有16个线程在逻辑上处于空闲状态,但却占用了相应的资源(图1)。或者在另一个例子中,一个64线程的任务可能由于非统一分支的原因,在两个线程组中有32个线程被屏蔽,导致实际只有32个线程在运行,利用率仅为50%,同时浪费了寄存器和计数器资源(图2)。
这引出了Apple的视频中提到的编译器分配操作:在编译时统计某个任务的ISA最高资源需求来分配资源。根据Apple的解释,他们似乎可以在硬件层面监控这些未被充分利用的资源,并动态地释放给调度器,从而使硬件在同一时间内能够调度更多的计算组,提高GPU的并行吞吐量??因此,个人认为这种技术并不是关于动态显存分配或者SLC/L2/L1或者指令预取等概念,而是关于在硬件级别优化寄存器等资源利用的更深层次的策略。
最后再看看图3苹果的描述图片,倒也符合前面的设想。另外这只是我根据一些资料以及自己的理解去设想的一个解释,具体形式还是只有苹果自己知道了。感觉也是个很黑盒的东西,根本不知道硬件具体怎么执行也。@巴萨7号 @NPacific @junjie1475


IP属地:上海来自iPhone客户端1楼2023-11-07 20:55回复
    https://docs.nvidia.com/deeplearning/performance/dl-performance-gpu-background/


    IP属地:上海来自iPhone客户端2楼2023-11-07 20:56
    回复
      https://docs.unity3d.com/Manual/shader-branching.html#dynamic-branching


      IP属地:上海来自iPhone客户端3楼2023-11-07 20:56
      回复
        https://gpuopen.com/wp-content/uploads/2021/01/AMD_Graphics_pipeline_GIC2020.pdf


        IP属地:上海来自iPhone客户端4楼2023-11-07 20:57
        回复
          上面是一些参考资料。


          IP属地:上海来自iPhone客户端5楼2023-11-07 20:57
          回复
            你可以去找找苹果专利
            这里是Maynard的猜测
            (a) common pool of SRAM for L1D and Scratchpad (like nVidia)
            (b) Scratchpad can be shared across cores (like recent nVidia)
            (c) GPU 2nd-level paging allows for oversubscription of Scratchpad (and RT) address space
            我个人感觉a) b)比较可能


            IP属地:马来西亚6楼2023-11-07 21:09
            回复
              其他一些关于GPU的资料
              https://interplayoflight.wordpress.com/2020/05/09/gpu-architecture-resources/


              IP属地:马来西亚7楼2023-11-07 21:16
              收起回复
                其实没啥用,算力带宽才是硬道理


                IP属地:江苏来自iPhone客户端8楼2023-11-08 00:14
                收起回复
                  尝试用a17在shader中做了一个动态分支,一个放一堆复杂计算,一个放一个简单的计算。通过metal debug观察,a17貌似不论是否有昂贵的分支存在shader代码中,只要不跑到昂贵分支上,每sp都能跑满occupancy,而a16在不删掉昂贵分支,确保只跑便宜的动态分支下,occupancy却下降到百分之40多的样子,看起来是为最坏的情况分配了寄存器等资源。这么看更动态缓存像是一种延迟分配策略。具体其他的on chip memeory还没有观察到什么变化。而且从结果看貌似a17也有这个功能@巴萨7号 @NPacific @junjie1475


                  IP属地:上海来自iPhone客户端9楼2023-11-09 18:17
                  收起回复
                    爱取踢踢批+冒号+双斜杠+patentimages.storage.googleapis.com/2d/72/df/117a4012487c19/US20210271606A1.pdf


                    IP属地:上海来自iPhone客户端11楼2023-11-09 18:24
                    回复
                      可怕的布老师,点进来以为是知乎


                      IP属地:浙江来自iPhone客户端12楼2023-11-12 11:45
                      收起回复
                        太可怕了,我来速速拜读一下


                        IP属地:四川14楼2023-12-10 10:28
                        收起回复
                          回头看了一遍,因为imr和tbdr在管线上的不同,直接将imr 转成tbdr的游戏是把Gbuffer转入on chip memory 中,因为苹果的小,所以容易爆,加入dynamic caching应该是为了这个,为生态做硬件上的妥协


                          IP属地:广西来自iPhone客户端15楼2024-01-29 12:45
                          收起回复