并行编程的禅意:内核的姿态
摘要
一篇博客文章,通过HipKittens论文的视角探索并行编程概念,重点介绍了AMD GPU上重叠计算与内存移动的八波乒乓调度,并与禅宗原则进行了哲学类比。
暂无内容
查看缓存全文
缓存时间: 2026/07/27 07:44
# 并行编程的禅意:内核之姿态 - smolnero
来源:https://smolnero.com/posts/the-zen-of-parallel-programming-the-posture-of-a-kernel
在并行编程的探索之旅继续前行之际,我将目光转向 GPU 内核,而继续探索的最佳起点莫过于 **HipKittens: Fast and Furious AMD Kernels**(https://arxiv.org/pdf/2511.08083)这篇论文。
GPU 内核是一种专用函数,会在 GPU 上被多次启动。每次调用都遵循相同的通用操作,同时接收自身的位置和对应的数据部分。内核本身看似简单,但其执行过程却涉及线程、波前(wavefront)、线程块、图块(tile)、寄存器、内存,以及负责承载这一切活动的架构。在该论文研究的 AMD 硬件上,线程被分组为 64 线程波,而多个波则在 GPU 计算单元内的线程块中一起调度。
残酷的事实是,内核依赖于表达它的线程、为其提供转换素材的数据,以及决定该转换如何在物理上发生的硬件。即使相同的基于图块的抽象从 NVIDIA 迁移到 AMD,HipKittens 发现,用于表达该抽象的算法必须针对 AMD 架构重新设计。抽象可以迁移,但它无法不受接收它的条件的影响。
该论文的核心贡献之一是一个八波乒乓调度方案,旨在将计算与内存移动重叠。八个波被放置在同一个线程块中,每个 SIMD 单元上驻留两个波。在每对波中,一个波执行矩阵计算,而另一个波预取下一阶段所需的数据。然后它们交换角色,在计算和内存之间来回切换,而不是永久固定于任何一个身份。这让我想起了《禅心·初心》中"姿势"章节的内容,铃木在此描述我们既独立又依赖,"非二,亦非一"。配对的波仍然是可区分的。一个正在计算,另一个正在移动内存,各自承担着暂时的责任。但没有一个角色能单独解释完整的活动。计算波依赖于数据的到达,而内存波执行的工作,其价值要通过后续的计算才能显现。
最让我感兴趣的是,没有一个波会永久固定于自己的角色。一个准备,另一个行动,然后它们交换位置。它们的责任是真实的,但也是暂时的。更大的活动不仅依赖于每个波执行自身任务,还依赖于每个波能在关系要求不同时释放该任务。也许姿势不仅是我们所处的位置,更是我们在位置变化时维持的关系。这让我回到《并行编程导论》中更一般的教训。并行活动需要足够的独立性以让不同的工作同时发生,但也需要足够的依赖性以使这些分离的动作仍然属于一个整体计算。完全的独立性会导致孤立的工作,永远无法成为整体。另一个极端是,如果每个参与者在取得进展之前都依赖所有其他参与者,那么并行运动就会沦为等待。
人类或许也存在于同样的张力之中。我们在完全理解条件之前就遇到了它们。我们携带记忆,继承家庭模式、期望、恐惧,有时还有可能倾向于成瘾或抑郁的体质。我们也可能经历一些事件,这些事件让身体和心灵在原始条件已经过去之后仍然保持某种特定姿势。这些经历是真实的,其影响不应仅仅因为它们属于过去就被忽视。
曾经保护我们的角色,后来可能阻碍我们前进。曾经帮助我们生存的看待方式,最终可能让每一个新条件都变得像创造它的那个条件。我们可能开始相信,因为系统学会了一种行动方式,它就必须永远以同样的姿势执行。
人类不是 GPU 内核,创伤也不能简化为指令调度。让我感兴趣的是,在一种条件下习得的姿势,当条件改变时可能并不是唯一可用的姿势。HipKittens 提醒我,即使一个抽象的目的仍然可识别,当它进入不同条件时,其表达方式可能必须改变。答案不是假装新架构与旧架构相同。也不是抛弃一切过去的东西。而是要理解哪些可以迁移,哪些必须重组,以及哪些在当前执行中已不再属于这里。
或许向内审视,部分是为了识别我们自己身上哪些部分仍在执行那些在已不复存在的条件下形成的指令。不是为了抹去我们面前的生活或经历,而是为了它们的影响不必成为唯一可用的姿势。
过去仍然是系统的一部分,但它不必永远是它的调度器。
相似文章
并行编程之禅
一篇反思性文章,将通信、同步等并行编程概念与禅宗哲学和人类内部协调联系起来。
@charles_irl: 重写并行是一项重大举措,如果能比我们用CuTe DSL实现的速度更快就好了。FA4是一个非常…
关于使用CuTe DSL和瓦片编程模型重写并行性以提升FA4 (FlashAttention 4) 内核性能的讨论。
@reprompting: https://x.com/reprompting/status/2074133435401064486
一条详细总结《大规模并行处理器编程》一书的推文串,重点介绍CUDA和GPU编程概念、优化技术以及并行模式。
@SzymonOzog_: 周六阅读:“What happens when you run a CUDA kernel”——非常酷的博客文章,详细介绍了CPU与GPU通信的细节…
推荐一篇博客文章的推文,该文章解释了启动CUDA内核时所需的CPU-GPU通信细节。
@ycombinator:在我们的最新 YC Paper Club 上,研究人员和开发者介绍了多 GPU 内核、每瓦特智能、异构……
Y Combinator 举办了一场 Paper Club,研究人员展示了多 GPU 内核优化的创新,包括 ParallelKittens,这是一个简化重叠多 GPU 内核开发并在多种工作负载下实现显著加速的 CUDA 框架。