H200 · HOPPER GH100 · 特性专题
Thread Block Clusters
★ Hopper 集群主线 · CUDA 编程层级新加一层,是 DSMEM / TMA multicast 的前提
是什么
DEFINITIONthread block cluster 是 Hopper 在 thread block 与 grid 之间新增的一级——一组保证同驻于同一 GPC(内含多个 SM 的硬件分区)的协作 CTA,可彼此同步、可直接访问彼此的 shared memory。
NOTE · 编程层级(Hopper 新增 cluster 层)
thread → warp(32)→ warp group(128,wgmma 单位)→ thread block(单 SM)→ thread block cluster(≤8 SM,同 GPC)★ → grid
为什么需要(vs A100)
RATIONALE · VS A100A100 的 thread block 相互独立,block 间协作只能靠 global memory + grid-level sync(this_grid().sync()),数据要经 L2 往返、粗粒度。cluster 提供细粒度、低延迟的跨 SM 协作:
- 保证同驻 → 可用硬件 barrier 同步(
barrier.cluster); - 解锁 DSMEM(直接读写邻居 SM 的 smem,~200cyc,不经 L2);
- 解锁 TMA multicast(一份 global→smem 拷贝广播到多个 CTA);
- 支撑 cluster-wide 归约、producer/consumer 流水线。
关键数字
KEY NUMBERS · CONSTRAINTS| 项 | 值 | 注 |
|---|---|---|
| Hopper 最大 cluster | 8 个 thread block | cluster_dims.x·y·z ≤ 8(16 是 Blackwell) |
| cluster 必须同驻于 | 同一 GPC | 物理邻近,专用 SM-to-SM 网络 |
| grid 与 cluster 关系 | grid 各维 = cluster 各维整数倍 | 否则 launch 失败 |
| 声明方式 | 编译期 __cluster_dims__(X,Y,Z) | 或运行期 cudaLaunchKernelEx + cudaLaunchAttributeClusterDimension |
| DSMEM 可寻址范围 | 同 cluster 全部 block 的 smem | 即 ≤8 SM 的 smem |
| cluster 同步指令 | barrier.cluster.arrive / .wait | sm_90+ 特殊寄存器 %cluster_ctarank |
| DSMEM vs 走 global | ~快 7× | NVIDIA 官方口径 |
可编译示例
COMPILABLE EXAMPLE · VERBATIM逐字摘自 CUTLASS cluster_sm90.hpp + PTX §9.7.14.3。
// 编译期声明 cluster 维度(2 blocks 沿 X);grid 各维须是其整数倍
__cluster_dims__(2, 1, 1)
__global__ void cluster_kernel(int* out) {
uint32_t rank;
asm volatile("mov.u32 %0, %%cluster_ctarank;\n" : "=r"(rank) :); // cluster 内 block 序号
// cluster.sync() == arrive; wait; (硬件 barrier,跨 SM)
asm volatile("barrier.cluster.arrive.aligned;\n" : :);
asm volatile("barrier.cluster.wait.aligned;\n" : :);
out[rank] = (int)rank;
}
/* 运行期声明(与编译期二选一,但数值必须一致):
cudaLaunchAttribute attr{};
attr.id = cudaLaunchAttributeClusterDimension;
attr.val.clusterDim = {2,1,1};
cudaLaunchConfig_t cfg{...};
cfg.attrs = &attr; cfg.numAttrs = 1;
cudaLaunchKernelEx(&cfg, cluster_kernel, out); */
注意事项 / 陷阱
PITFALLS · CHECKLIST
CAUTION · 陷阱清单
__cluster_dims__乘积必须 ≤ 8(运行期可查询cudaOccupancyMaxActiveClusters获实际可同驻上限,常更低)。- 编译期
__cluster_dims__与运行期 attribute 必须一致,不匹配 → launch 失败。 - Clusters 是 DSMEM 与 TMA multicast 的前提;不开 cluster 却用这两个特性是 UB。
- 同驻要求 → 高 smem / 寄存器需求会压低 cluster occupancy,过大 cluster + 重资源可能直接 launch 失败。
barrier.cluster.arrive只发到达信号不阻塞,必须配.wait才真正同步;DSMEM 读前少任一个即数据竞争。
数据源
SOURCES- PTX ISA §2.2.2 / §9.7.14.3 barrier.cluster(cluster 模型 + 同步指令语义)
- CUDA Programming Guide §3.1.2 Launching Clusters(cudaLaunchKernelEx 属性)
- CUTLASS cluster_sm90.hpp(device intrinsic 包装,逐字)
- → 配套特性:DSMEM 分布式共享内存