数据科学

使用 NVIDIA Nsight Profiler 简化 EDF 流体动力学模拟的 GPU 移植

将现有 CPU 应用程序移植到 NVIDIA GPU 可以释放性能提升,使用户能够以更大的规模和更快的速度解决问题。虽然修改代码以实现 NVIDIA GPU 加速需要在初始阶段投入时间和精力,但由此带来的吞吐量和效率提升通常远远超过成本。

这样的任务可能看起来令人生畏,并引起了人们的担忧,因为他们会浪费时间,最终产生无法提供任何好处的半移植 CPU 代码到 GPU 代码。但是,将 CPU 代码移植到 GPU 代码可以逐步完成,从而实现即时加速并更大限度地降低风险。

在整个移植过程中,如果不需要先进的内核优化技术,将单个任务从 CPU 移植到 GPU 可提供显著的加速和下游性能优势,则经常会出现这种情况。

无论您是初学者还是资深 NVIDIA CUDA 开发者,NVIDIA Nsight 工具套件都支持整个移植流程。只需轻松设置 NVIDIA Nsight Systems,即可开始分析代码并识别需要更少努力的加速机会。NVIDIA Nsight Compute 等高级工具可以在这些工作的基础上进行构建,并优化单个内核的性能,确保整个应用程序尽可能快地运行。

加速能源模拟

法国电力公司 (EDF) 、AWS、NVIDIA 和 Aneo 正在携手合作,以迭代方式将由 EDF 使用并由 NVIDIA GPU 加速的 code_saturne 计算流体动力学 (CFD) 应用移植到 AWS。

EDF 是一家归法国政府所有的跨国电力公用事业公司,也是全球最大的电力生产商之一。1997 年,该公司开发了 code_saturne,以提供能够模拟复杂流体动力学流的多功能开源工具。此工具通过对物理实验无法获得的场景进行高保真建模,实现发电厂的安全评估和生命周期延长。

该项目旨在使 code_saturne 能够使用 NVIDIA 软件和硬件平台,同时维护其模块化架构,以促进适应 NVIDIA GPU,包括通过 AWS Cloud 进行访问。

本博文使用正在进行的 code_saturne 协作的摘要,展示如何开始使用 Nsight 在 NVIDIA GPU 上轻松加速 CPU 应用程序。

准备用于分析的代码

对于 code_saturne 等高级且功能丰富的代码,应优先移植哪些部分并不明显。使用 Nsight Systems 进行的仔细分析有助于识别代码瓶颈,并告知开发者在此过程中的工作重点。

以增量方式移植,以最大限度地减少破坏性更改,并确保代码在整个过程中始终可用。最初的挑战是确保随着代码的发展,内存在 GPU 中始终可见。CUDA 托管内存解决了这一难题,它使 CUDA 驱动程序能够根据使用位置自动在 CPU 和 GPU 内存之间迁移数据。

受管理内存使开发者能够更轻松地完成工作。它确保 CPU 和 GPU 可以使用相同的逻辑地址,并使 Nsight Systems 可以看到内存传输以进行跟踪和分析。

通过将其与 NVIDIA 工具扩展程序 (NVTX) 注释相结合,Nsight Systems 分析并追踪了移植 code_saturne 的进展,以确定代码的哪些部分是流程中每个步骤的瓶颈以及每个瓶颈的性质。

您可以在 code_saturne 代码的关键部分中轻松添加和嵌套 NVTX 标注。nvtxRangePushA 命令开始并命名范围,而 nvtxRangePop 则关闭每个范围。这使得开发者能够命名代码区域,以便它们在应用程序配置文件中熟悉和清晰。此标注 API 也可用于 PythonFortran,而且许多 NVIDIA 数学库内置 NVTX。

图 1 定性展示了通过 code_saturne 仿真生成的 Nsight Systems 报告。每个迭代都包含一个自定义编写的梯度代码 (绿色) ,然后是多网格求解器步骤的进程 (紫色) ,这些步骤依赖于 AmgX 等库。

Stack of blocks. The top level is Initialization and Simulation. Under simulation, a sequence of blocks named iteration. Iteration block expanded in a Gradient block followed by a V-shaped group of Solve blocks, annotated Multigrid Solver.
图 1。使用多网格求解器对 code_saturne 仿真的 Nsight Systems 报告进行定性描述

在这里,可以直观地观察代码的主要部分,以确定哪些例程最耗时,并值得进一步调查,以确定是否有任何代码移植机会。

识别 Porting 机会

对 NVTX 标记的特定代码段 (例如上图中的“Gradients”) 进行详细分析,可以提供丰富的见解和潜在的代码移植机会。图 2 展示了一段 code_saturne 的 Gradients 代码,可立即揭示两个潜在问题。

首先,很长的代码段仅在 GPU 空闲时在 CPU 上运行。其次,当数据从 CPU 传输到 GPU 时,跟随的两个内核会显示页面迁移。两者都证明这部分 CPU 代码是移植到 GPU 的绝佳候选代码。

Nsight Systems profile for a CPU-heavy workload with unoptimized code, resulting in slow CPU-to-GPU memory transfer.
图 2。通过大量 CPU 到 GPU 显存传输分析 CPU-only 进程

开发者使用这些信息来指导他们,并以增量方式将更多计算转移到 GPU,从而减少分页迁移和 GPU 空闲时间。图 3 显示了这项工作的结果。移植前,CPU 段运行时间为 12.3 毫秒。移植后,运行时间为 0.69 毫秒,速度提高了 18 倍。第二个下游优势是,现在 GPU 上有更多的数据,这减少了以下两个内核的内存传输,将其总执行时间加快了 4 倍。

Nsight user interface showing a CPU-heavy workload ported to NVIDIA GPUs, resulting in up to 18x speedup.
图 3。使用并行 GPU 代码替换 CPU 可实现高达 18 倍的速度提升

code_saturne 项目仍在进行中,接下来已在进行的步骤是开始内核优化,以确定如何进一步改进 GPU 代码。Nsight Compute 等工具对于这项工作至关重要。

立即加速您的代码

将 CPU 代码移植到 GPU 并不像您想象的那样令人生畏。这个过程可以是渐进式的,而 NVIDIA 提供的 power tools 使这项工作成为一项轻松且值得的时间投资。

访问 Nsight SystemsNsight ComputeNVTX 的文档页面,详细了解可用工具。

详细了解 EDF 的 code_saturne

 

 

标签