SoAx: 一种用于高性能计算代码中处理粒子的通用 C++ 数组结构
计算物理
2018-03-14 v1 数学软件
摘要
物理问题的数值研究常常需要对大量粒子根据给定方程组进行动力学积分。粒子由其携带的信息(如标识、位置等)来表征。在高性能计算(HPC)代码中,处理粒子通常有两种不同的方式。数组结构(AoS)的概念秉承面向对象编程(OOP)范式的精神,将粒子信息实现为一个结构体。这里,一个对象(结构体的实例)代表一个粒子,而许多粒子的集合存储在一个数组中。相比之下,使用结构数组(SoA)的概念,单个结构体包含多个数组,每个数组代表整个粒子集合的一个属性(如标识)。AoS 方法因其便利性和灵活性而常在 HPC 代码中实现。然而,对于一类问题,已知 SoA 的性能远优于 AoS。我们在自己的粒子问题中证实了这一观察。通过基准测试,我们表明在现代 Intel Xeon 处理器上,SoA 实现通常比 AoS 快数倍。在 Intel 的 MIC 协处理器上,性能差距甚至达到十倍。对于 GPU 计算,无论是计算专用还是多用途 GPU,情况也是如此。结合性能与便利性,我们推出了 SoAx 库,该库具有最优性能(在 CPU、MIC 和 GPU 上),同时提供与 AoS 相同的便利性。为此,SoAx 使用了现代 C++ 设计技术,如模板元编程,允许为用户定义的异构数据结构自动生成代码。
引用
@article{arxiv.1710.03462,
title = {SoAx: A generic C++ Structure of Arrays for handling Particles in HPC Codes},
author = {Holger Homann and Francois Laenen},
journal= {arXiv preprint arXiv:1710.03462},
year = {2018}
}