如何在集群上的 C++ 中存储 TB 大小的数组

计算科学 C++ 并行计算 高性能计算 内存管理 聚类
2021-12-03 05:27:21

我想做一个巨大的模拟,需要大约 1 TB 的数据来描述一堆相互作用的粒子(每个粒子都有不同的相互作用)。是否可以将这些数据存储在 C++ 中的数组中,以便我可以在模拟期间访问它?

我可以访问 60 个节点的集群。每个节点有 2 个 48x16GB DDR4 的 CPU。因此,每个节点总共有 192 GB,或者集群上总共有 11520 GB = 11 TB。您将如何在此集群上动态分配 1 TB 阵列?

3个回答

您可以尝试使用UPC++,它设置了一个分布在您的节点上的全局可访问地址空间。

更标准的方法是学习如何使用MPI

实际上,在多节点集群上运行模拟的唯一方法是使用 MPI。而且你不会分发数据,因为那意味着它会从一个地方开始。使用 MPI,一切都是分布式的,包括分布式创建。

这也意味着您不会创建一个全局数组:在您的情况下,您有 120 个进程,每个进程都可以存储一个本地数组。这种数组的每个元素都有一个全局编号,但您不使用它进行索引。如果节点 10 具有 100 万到 200 万个元素,则本地索引 27 对应于全局索引 1,000,027。因此,您使用 27 进行索引,但 1000027 用于确定您在模拟中的空间坐标。

换句话说:你有一堆局部数组,但从概念上讲,它们组合成一个大的全局数组。

有处理分布式数组的包,比如全局数组:https ://hpc.pnl.gov/globalarrays/

如果这不能满足您的需求,请搜索 PGAS - Partitioned Global Address Space。