CommSwizzle 通信调度算法详解【免费下载链接】catccosCATCCOS昇腾计算-通信融合算子模板库是一个聚焦于提供高性能计算通信融合类算子基础模板的代码库。项目地址: https://gitcode.com/cann/catccos概述CommSwizzle 是 catccos 库中用于多核并行通信调度的 swizzle 算法。它解决的核心问题是当多个 core 需要同时与多个远程 rank 进行数据通信时如何调度通信顺序使得在同一时刻不同 core 访问不同的 rank从而避免通信链路拥塞。核心数据结构参数类型含义gridShapeDistMatrixCoord(row, column, rank)通信数据的三维网格形状row × column 为数据维度rank 为远程节点数coreSplitMatrixCoord(row, column)并行 core 在数据维度(row)和 rank 维度(column)的划分loopIdxuint32_t迭代索引范围[0, Numel(gridShape))算法步骤第一步3D → 2D 展平将三维gridShape(row, column, rank)展平为二维矩阵flattenGridShape { row * column /* 数据维(行) */, rank /* rank维(列) */}第二步分组列优先遍历以swizzleOffset coreSplit[ROW_DIM]数据维度的 core 并行度为分组大小分组将ROW_DIM维度按swizzleOffset分成若干组组内遍历在每个组内先遍历ROW_DIM再遍历COL_DIM即ROW_DIM方向的的 swizzleOffset 个数据连续分配groupSize swizzleOffset × numRanks 组内 loopIdx → coord[COL] groupOffset / inGroupRows (ROW_DIM索引) coord[ROW] groupIdx * swizzleOffset groupOffset % inGroupRows具体效果如图所示[!NOTE] 配置GRID_ROW 4 # gridShape.rowGRID_COL 4 # gridShape.columnGRID_RANK 4 # gridShape.rankCORE_SPLIT_ROW 8 # coreSplit.row (data-dim parallelism)CORE_SPLIT_COL 1 # coreSplit.column (rank-dim parallelism)SWIZZLE_DIRECTION 0 # 0: row-major swizzle第三步Rank Shift核心创新对列索引rank 维度施加一个依赖于行索引的偏移uint32_t nStride gridShape.rank() / coreSplit.column(); uint32_t offset coord[1] * nStride; coord[1] (offset offset / gridShape.rank() coord[0]) % gridShape.rank();效果不同行的 core 在同一 loopIdx 下访问不同的 rank实现通信错开:[!NOTE] 配置GRID_ROW 4 # gridShape.rowGRID_COL 4 # gridShape.columnGRID_RANK 4 # gridShape.rankCORE_SPLIT_ROW 8 # coreSplit.row (data-dim parallelism)CORE_SPLIT_COL 1 # coreSplit.column (rank-dim parallelism)SWIZZLE_DIRECTION 0 # 0: row-major swizzle第四步2D → 3D 还原将展平的坐标还原为 DistMatrixCoordreturn DistMatrixCoord{coord[0] / gridShape.column(), // row coord[0] % gridShape.column(), // column coord[1]}; // rank算法效果示意假设gridShape (2, 2, 4),coreSplit (2, 2)loopIdx展平坐标 (data, rank)Shift后 rank最终 (row, col, rank)0(0, 0)0(0, 0, 0)1(1, 0)1(0, 1, 1)2(0, 1)2(0, 0, 2)3(1, 1)3(0, 1, 3)............[!TIP] 这个效果类似于Latin Square调度——在任意时刻每个 core 访问的 rank 都尽量不同最大化通信带宽利用率。设计目标避免通信冲突Rank Shift 确保同一时刻不同 core 错开访问不同的远程 rank提高带宽利用率分组遍历 Rank Shift 错位访问使通信链路负载均匀支持确定性模式IS_DETERMINISTIC模式只有一个core固定负责不同rank的同一位置同一数据index的数据避免了多个core搬运同一位置同一数据index的数据导致数据到达顺序不可控。当搬运不同rank的数据并使用atomic add操作进行reduce add时使用这个模式可以保证计算结果的可复现性。如下图所示没有开启确定性计算在step4每次有三个core并行操作不同rank的同一数据维度的数据开启确定性计算之后step4~step7都只有一个core在操作一个rank的数据步骤从6步增加到8步[!NOTE] 配置GRID_ROW 4 # gridShape.rowGRID_COL 4 # gridShape.columnGRID_RANK 4 # gridShape.rankCORE_SPLIT_ROW 12 # coreSplit.row (data-dim parallelism)CORE_SPLIT_COL 1 # coreSplit.column (rank-dim parallelism)SWIZZLE_DIRECTION 0 # 0: row-major swizzle模拟通过运行python comm_swizzle_animation.py可以模拟comm_swizzle通过以下配置修改GRID_ROW 4 # gridShape.row GRID_COL 4 # gridShape.column GRID_RANK 4 # gridShape.rank CORE_SPLIT_ROW 8 # coreSplit.row (data-dim parallelism) CORE_SPLIT_COL 1 # coreSplit.column (rank-dim parallelism) SWIZZLE_DIRECTION 0 # 0: row-major swizzle IS_DETERMINISTIC False # false: not deterministic【免费下载链接】catccosCATCCOS昇腾计算-通信融合算子模板库是一个聚焦于提供高性能计算通信融合类算子基础模板的代码库。项目地址: https://gitcode.com/cann/catccos创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考