多节点多 GPU:大规模使用 NVIDIA cuFFTMp FFT

早在2022年1月27日,NVIDIA 就发布了 cuFFTMp 抢先体验 (EA)。cuFFTMp 是 cuFFT 的多节点、多进程扩展,使科学家和工程师能够在百万兆次级算力平台上解决具有挑战性的问题。

FFT(快速傅里叶变换)广泛应用于各种领域,从分子动力学、信号处理、计算流体动力学 (CFD) 到无线多媒体和机器学习应用。借助 cuFFTMp,NVIDIA 现在不仅支持单个系统中的多个 GPU,还支持跨多个节点的多个 GPU。

图 1 显示 cuFFTMp 达到 1.8 PFlop/s 以上,超过该规模变换峰值机器带宽的 70%。

标题 图 1.Selene 集群上的 cuFFTMp(弱缩放)性能

 在图 2 中,问题大小保持不变,但 GPU 的数量从 8 个增加到 2048 个。您可以看到 cuFFTMp 成功地对问题进行了强扩展,将单精度时间从 8 个 GPU(1 个节点)的 78 毫秒增加到 2048 个 GPU(256 个节点)的 4 毫秒。

标题 图2.Selene 集群上的 cuFFTMp(强扩展)性能

 

图 1 和图 2 在 Selene 集群上运行。Selene 由 NVIDIA DGXA100、每个节点 8xA100-80GB 组成,带有 NVSwitch(300 GB/s/GPU,双向)和 Mellanox Infiniband HDR(200 GB/s/节点,双向)。使用 CUDA 11.4 和 NVIDIA HPC SDK 21.9 Docker 容器运行测试,该容器可在 nvcr.io/nvidia/nvhpc:21.9-runtime-cuda11.4-ubuntu20.04 上获得。GPU 应用程序时钟设置为最大值。

性能和可扩展性

众所周知,分布式 3D FFT 是通信绑定的,因为这种类型的全局集体通信。 是分布式 FFT 的主要瓶颈,因为相对于高计算能力,节点间带宽较低,并且通信类型的加速器感知 MPI 实现质量参差不齐。MPI_AlltoallvMPI_Alltoallvall_to_all

cuFFTMp 使用 NVSHMEM,这是一个基于 OpenSHMEM 标准的新通信库,通过提供内核启动的通信专为 NVIDIA GPU 设计。NVSHMEM 创建一个全局地址空间,其中包括群集中所有 GPU 的内存。从 CUDA 内核内部执行通信可实现细粒度的远程数据访问,从而降低同步成本,并利用 GPU 中的大规模并行性来隐藏通信开销。

 通过使用 NVSHMEM,cuFFTMp 与 MPI 实现的质量无关,这一点至关重要,因为性能可能因 MPI 而异。有关详细信息,请参阅关于在高性能系统上对 FFT 库进行基准测试的中期报告。第 3 章

图 3 显示,随着 GPU 数量的增加,cuFFTMp 能够保持大约 75% 的峰值。 

图3.Selene 集群上 cuFFTMp 的弱缩放,显示为峰值性能的一小部分

 

峰值性能是将 2000 GB/s/gpu 用于双向全局内存带宽,使用 300 GB/s/gpu 用于双向 NVLink 带宽,使用 25 GB/s/gpu 用于 Infiniband 带宽。

设 N 是 1D 变换大小,G 是 GPU 的数量。每个 GPU 都拥有 N3/G 元素(每个 8 或 16 个字节),模型假设 N3/G 元素在全局内存中读取/写入 6 次,并且 N3/G2元素从每个 GPU 发送到每个其他 GPU 一次。在 4096 GPU 上,花在非 InfiniBand 通信上的时间不到总时间的 10%。

MPI 可移植性和多架构支持

如前所述,cuFFTMp 的性能不依赖于 MPI 实现。为了便携性,cuFFTMp 要求启动 MPI 并管理 CPU 上的数据分布。

目前,cuFFTMp 静态链接到 NVSHMEM。NVSHMEM 使用一个小型 MPI“引导插件”(nvshmem_bootstrap_mpi.so),它是使用 MPI 构建的,并在运行时自动加载。此引导程序面向 HPC SDK 中包含的 OpenMPI 版本。对于依赖于其他 MPI 实现的用户应用程序,EA 包包含帮助程序脚本,用于构建面向不同 MPI 的引导程序。

cuFFTMp 支持 Linux x86_64 和 IBM POWER 架构。您可以下载适用于不同架构的 EA 包。图 4 显示,在 256 个节点中使用 1536 个 V100 GPU,cuFFTMp 可以达到 50 TFlop/s 以上,转换 40963复杂的数据点,仅占 Summit 系统的 5%。

图4.Summit 集群上的 cuFFTMp (FP32) 性能

 

 图 5 显示,在 256 个节点中使用 1536 个 V100 GPU,cuFFTMp 可以达到 40 TFlop/s 以上,转换 40963复杂的数据点,仅占 Summit 系统的 5%。


图5.Summit 集群上的 cuFFTMp (FP64) 性能

 轻松过渡到 cuFFTMp

cuFFTMp 只是当前多 GPU cuFFT 库的扩展。大多数现有的多 GPU 函数都适用于 cuFFTMp。作为一个分布式的多进程库,cuFFTMp 要求 MPI 是引导的(“启动”),并期望数据分布在 MPI 进程之间。下表显示了将应用程序从使用多 GPU cuFFT 转换为 cuFFTMp 所需的代码。

多GPU, 单进程 cuFFTcuFFTMp

#include <cufftXt.h>

#include <cufftMp.h>
#include <mpi.h>

MPI_Init(&argc, &argv);
int rank, size;
MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); cudaSetDevice(my_device);

size_t my_NX = (NX / size) + (rank < NX %
size ? 1 : 0);

// host buffer h_f size NX*NY*NZ// host buffer h_f size my_NX*NY*NZ
cufftHandle plan_c2c;
cufftCreate(&plan_c2c);

for (auto i = 0; i < NGPUS; ++i)
    whichGPUs[i] = i;
cufftXtSetGPUs(plan_c2c, NGPUS, 
    whichGPUs)


MPI_Comm comm = MPI_COMM_WORLD; cufftMpAttachComm(plan_c2c, CUFFT_COMM_MPI, &comm);

size_t worksize;
cufftMakePlan3d(plan_c2c, NX, NY, NZ, CUFFT_R2C, &worksize);

cudaLibXtDesc *d_f;
cufftXtMalloc(plan_c2c, &d_f, CUFFT_XT_FORMAT_INPLACE);

cufftXtMemcpy(plan_c2c, d_f, h_f, CUFFT_COPY_HOST_TO_DEVICE);

cufftXtExecDescriptor(plan_c2c, d_f, d_f, CUFFT_FORWARD)
// Any user-defined operations (filtering, …)
cufftXtExecDescriptor(plan_c2c, d_f, d_f, CUFFT_INVERSE)

cufftXtMemcpy(plan_c2c, h_f, d_f, CUFFT_COPY_DEVICE_TO_HOST);
cufftXtFree(d_f)

MPI_Finalize();

Slab、pencil和block分解是多维FFT算法中数据分布方法的典型名称,目的是跨节点并行化计算。cuFFTMp EA只支持优化的slab (1D)分解,并提供辅助函数,例如cufftXtSetDistribution和cufftMpReshape,以帮助用户从任何其他数据分布重新分发到cuFFTMp的slab数据分布。

cuFFTMp EA包包括c++和Fortran示例,涵盖了一系列用例:C2C, R2C/C2R,不同的计划共享工作区,以及将数据从一个发行版转移到另一个发行版或跨gpu重新分发。cuFFTMp使用EA包中包含的HPC SDK 21.7+编译器和包装器,为Fortran应用程序提供全面支持。

湍流模拟

cuFFTMp使科学家能够研究流体湍流这一具有挑战性的问题,这是物理学中最古老的未解决问题。

为了了解湍流流动行为,印度海得拉巴塔塔基础研究所(TIFR)的一个研究团队开发了Fluid3D,这是一个CFD软件包,利用伪谱方法对Navier-Stokes方程进行直接数值模拟(DNS),从根本上了解湍流流动行为。与MPI CPU版本相比,将Fluid3D移植到cuFFTMp和CUDA上,每次迭代所需的时间要短得多,并且可以在合理的时间内模拟高雷诺数流。

DNS是提高对湍流流动认识的关键工具,而伪谱方法由于其计算效率和准确性而被广泛使用。湍流由不同尺度的涡旋组成,能量由大尺度运动向小尺度运动传递。模拟和理解大型DNS运行中最小湍流结构的各向同性行为是非常重要的。

图6显示了使用Fluid3D对均匀各向同性湍流衰减进行DNS研究的涡度等面。

图6。湍流涡度场等面,用Fluid3D模拟。模拟的网格分辨率为5123,在海德拉巴TIFR的高性能计算设施进行。

 

湍流流动模拟的挑战在于需要获得高雷诺数。为了保持计算稳定性,Re数受到网格分辨率的限制,即Re2.25 < N3,其中N为每个维度的网格点数。因此,模拟高雷诺数湍流流动需要的数值分辨率在计算上是昂贵的,甚至是令人望而却步的。

表1显示了最大Re数所需的网格分辨率和模拟所需的内存。

网格分辨率模拟雷诺数内存需求 (GB)
10243199.288
20483316.2704
40963501.95,632
81923796.845,056
1228831044.1152,064
1638431264.8360,448

 表1。湍流DNS软件包Fluid3D需要大的数值分辨率和系统内存来模拟高雷诺数流

Fluid3D在傅里叶空间中使用二阶指数Adams-Bashforth时间步进方法。模拟通常集成在数万个时间步长上,每个时间步长计算9个3d - fft。fft主导着整个仿真运行时。每个时间步长所经过的壁时间是衡量某一特定数值实验配置的求解时间是否合理的重要指标。

图7显示了Fluid3D的每个时间步的墙时间在5秒以下,分辨率为81923,在Selene上使用1024个A100 gpu(128个节点)。使用FFTW-MPI的CPU版本,每次迭代需要23.9秒,在单个64核CPU节点上使用64 MPI来解决10243个问题大小。与使用两个A100 gpu运行相同的10243个问题所需的时间相比,很明显,Fluid3D从一个CPU节点到单个A100的加速速度超过20倍。

 

图7。在Selene上运行的Fluid3D DNS的每个时间步的隔离时间

 

 如何使用cuFFTMp

有兴趣尝试使用cuFFTMp将应用程序转换为在多个节点上运行吗?转到cuFFTMp EA的入门页面。下载cuFFTMp后,使用示例代码,看看它们与多gpu版本有多相似,以及它们如何在多个节点上扩展。Multinode Multi-GPU: Using NVIDIA cuFFTMp FFTs at Scale | NVIDIA Technical Blog

 

 

  • 10
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术瘾君子1573

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值