Kokkos Module 3 MD
1. MDRangePolicy:多维并行策略 🏎️
用于并行化 2 到 6 维 的紧密嵌套循环(类似于 OpenMP 的 collapse 子句) 。
-
语法结构 :
parallel_for("Label", MDRangePolicy<Rank<N>>({起始索引}, {结束索引}, {分块尺寸}), KOKKOS_LAMBDA(i, j, ...){...}); -
核心特性:
- 维度声明:通过
Rank<N>指定维数(2-6 维) 。 - 矩形空间:仅支持矩形迭代空间 。
- 分块策略 (Tiling) :默认使用分块来优化缓存重用 。在 GPU 上,一个 Tile 由一个线程块(Thread Block)处理 。
- 硬件限制:Tile 的总线程数(各维度乘积)不能超过硬件上限(通常为 1024) 。
- 维度声明:通过
-
迭代模式 (Iteration Pattern) :
- 可以控制 Tile 之间和 Tile 内部的遍历顺序(
Iterate::Left或Iterate::Right) 。 - 性能关键:迭代模式应与 View 的内存布局(Layout)匹配,以实现访存合并(Coalescing) 。
- 可以控制 Tile 之间和 Tile 内部的遍历顺序(
2. 子视图 (Subviews):视图切片 🧩
用于获取现有 View 的一部分,类似于 Python/Matlab 的切片语法 。
-
核心特性:
- 零开销:子视图与原视图指向相同数据,无内存分配或拷贝 。
- 灵活性:可以在 Host 或 Kernel 内部构建 。
-
参数类型 :
Index:固定索引。每使用一个 Index,结果视图的秩(Rank)减 1 。Kokkos::pair<start, end>:指定范围,秩保持不变 。Kokkos::ALL:代表该维度全部范围,秩保持不变 。
-
最佳实践:
- 始终使用
auto接收返回类型,因为其类型由实现定义且非常复杂 。
- 始终使用
3. 非托管视图 (Unmanaged Views):外部内存包装 🛡️
用于包装并非由 Kokkos 分配的外部指针(如 std::vector 或 C 风格数组) 。
-
特性:
- 不管理生命周期:无引用计数,销毁时不会释放内存 。
- 无安全检查:不自动检查内存空间(Memory Space)是否匹配 。
-
用法 :
View<double**, HostSpace> v(ptr, N0, N1);(构造时不提供标签字符串 )。 -
工作流:通常先用非托管 Host 视图包装,再通过
create_mirror_view_and_copy同步到 GPU 。
4. 原子操作与 ScatterView:线程安全 🛡️
解决多线程同时写入同一地址(散布-贡献模式,如直方图计算)的竞态条件 。
-
原子函数:
Kokkos::atomic_add、atomic_max等提供可移植的解决方案 。 -
内存特性 (Memory Traits) :可以使用
MemoryTraits<Atomic>让对 View 的所有访问自动变为原子操作 。 -
ScatterView :
- 算法抽象:在 GPU 上自动使用原子操作(Atomics),在 CPU 上自动使用数据复制(Data Replication) 。
- 关键接口:
access()获取访问器,reset()重置副本,contribute()合并结果回原视图 。
5. DualView:跨空间同步管理 🔄
简化主机(Host)与设备(Device)之间数据搬运的管理 。
-
核心逻辑:内部同时持有 Host View 和 Device View 。
-
标记机制 :
view_host()/view_device():获取特定空间的视图。modify_host()/modify_device():标记该空间的数据已被更新。sync_host()/sync_device():根据标记自动决定是否执行深拷贝。
-
价值:开发者只需基于局部信息(当前函数是否修改或读取数据)进行操作,无需了解全局数据流即可保证同步正确 。