我想做一个巨大的模拟,需要大约 1 TB 的数据来描述一堆相互作用的粒子(每个粒子都有不同的相互作用)。是否可以将这些数据存储在 C++ 中的数组中,以便我可以在模拟期间访问它?
我可以访问 60 个节点的集群。每个节点有 2 个 48x16GB DDR4 的 CPU。因此,每个节点总共有 192 GB,或者集群上总共有 11520 GB = 11 TB。您将如何在此集群上动态分配 1 TB 阵列?
我想做一个巨大的模拟,需要大约 1 TB 的数据来描述一堆相互作用的粒子(每个粒子都有不同的相互作用)。是否可以将这些数据存储在 C++ 中的数组中,以便我可以在模拟期间访问它?
我可以访问 60 个节点的集群。每个节点有 2 个 48x16GB DDR4 的 CPU。因此,每个节点总共有 192 GB,或者集群上总共有 11520 GB = 11 TB。您将如何在此集群上动态分配 1 TB 阵列?
实际上,在多节点集群上运行模拟的唯一方法是使用 MPI。而且你不会分发数据,因为那意味着它会从一个地方开始。使用 MPI,一切都是分布式的,包括分布式创建。
这也意味着您不会创建一个全局数组:在您的情况下,您有 120 个进程,每个进程都可以存储一个本地数组。这种数组的每个元素都有一个全局编号,但您不使用它进行索引。如果节点 10 具有 100 万到 200 万个元素,则本地索引 27 对应于全局索引 1,000,027。因此,您使用 27 进行索引,但 1000027 用于确定您在模拟中的空间坐标。
换句话说:你有一堆局部数组,但从概念上讲,它们组合成一个大的全局数组。
有处理分布式数组的包,比如全局数组:https ://hpc.pnl.gov/globalarrays/
如果这不能满足您的需求,请搜索 PGAS - Partitioned Global Address Space。