关于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


首先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


