Learn Kokkos Module 3

5 阅读3分钟

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::LeftIterate::Right) 。
    • 性能关键:迭代模式应与 View 的内存布局(Layout)匹配,以实现访存合并(Coalescing) 。

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_addatomic_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():根据标记自动决定是否执行深拷贝。
  • 价值:开发者只需基于局部信息(当前函数是否修改或读取数据)进行操作,无需了解全局数据流即可保证同步正确 。