Quote

GA

Global Array

核心概念

  • 分区全局地址空间 (Partitioned Global Address Space, PGAS) 模型: GA 属于 PGAS 编程模型。这意味着它提供了一个全局的、统一的视图来访问分布式内存中的数据,尽管数据在物理上是分散存储在不同的处理器上的。
  • 单边通信: GA 支持单边通信原语,如 Get (获取数据)、Put (放置数据) 和 Accumulate (累加数据)。这意味着一个处理器可以直接访问或修改另一个处理器上的数据,而不需要显式的消息传递或目标处理器的协作。这简化了并行编程,因为它避免了传统消息传递模型中复杂的同步和协调。具有强异步进展,单边操作可以并行进行,操作的完成与发起操作的处理器之间的同步是解耦的。
    • 你可以观察到开很多线程进行数值计算和清零等
    • 以及各种 MPI 的网络通信
    • 但是这!都!不!重!要!
  • ARMCI (Aggregate Remote Memory Copy Interface) 是 Global Arrays 内部使用的单边通信抽象层。它负责处理底层的网络通信和内存访问,使得 GA 能够提供高效的单边通信功能。
  • 多维数组操作: GA 专注于操作多维数组,支持数值线性代数方法用于执行各种例如矩阵运算。它允许程序员创建、访问和操纵分布在多个节点上的大型多维数组,这对于科学计算和高性能计算应用程序非常有用。
double precision buf(100,100)
ga_initialize()
ga_create(MT_DBL, 100, 100, 'matrix', 1, 1, g_m)
ga_create(MT_INT, 1, 1, 'counter', 1, 1, g_c)
ga_zero(g_m); ga_zero(g_c); ga_sync()
buf = 100.0
ga_put(g_m, 1, 100, 1, 100, buf, 100)
buf = 1.0
ga_acc(g_m, 1, 100, 1, 100, buf, 100, 1.0)
ga_get(g_m, 1, 100, 1, 100, buf, 100)
! buf = 101.0 (if nproc=1)
do j=1,100 k = ga_read_inc(g_c, 1, 1)
! k = 99 (if nproc=1)
ga_destroy(g_m); ga_destroy(g_c)
ga_terminate()
指向原始笔记的链接

NWChem

  • Infiniband 使用 uvx 优于libfabric

为什么我们需要基于 MPI 的 ARMCI?

  • 所有 HPC 系统都支持 MPI,并且所有积极维护的 MPI 实现都支持 MPI-3,包括 RMA。没有理由不利用这一点。
    • DOE 采购现在要求单边和多线程 MPI…
  • 低级网络 API 的可用性各不相同。重新实现页面注册缓存和流控制是痛苦的。与 MPI 的互操作性(Scalapack 所需)无法保证。一些 HPC 系统不文档化甚至不公开低级网络接口。
  • 允许计算机科学家专注于更紧迫的问题,例如异构执行。

对软件调优不敏感

Scaling

  • 多节点扩展性不一定好
    • 1 2 分布式内存
    • 10~12