如何模拟超过 10 亿个粒子?

计算科学 计算物理学 模拟 高性能计算 数值建模
2021-12-15 17:28:55

我想模拟毛细血管中的人类红细胞。我计算过,对于 1 米长和 1 毫米直径的毛细管,大约有 30 亿个血细胞。

红细胞实际上是圆盘,但我们假设它是一个简单的长方体。我们有什么

Erythrocyte -> vertex[8] -> double x

                            double y

                            double z

在 C++double中,权重为 8 个字节。1个顶点=24字节,8个顶点=24字节=一个红细胞的数据大小。24*7 十亿字节 = 168 GB不幸的是,我只有 4 Gb RAM。我该怎么办?我从来没有在计算。

  • 尝试减少计算?

实际上,血管直径分布很广,例如,最大的是主动脉(据我所知)-几厘米,最短的可能直径约为单个红细胞大小〜10um,顺便说一下,10um只有毫米的第 100 部分,因此减小血管直径是没有意义的。

减小容器的宽度?好的,让它成为 0.3 m = 30 cm。重新计算:

假设容器是一个圆柱体,直径=0.001 m,高度=0.3 m。体积等于平均红细胞体积2.356194491011μm390μm3

我们有26 亿个红细胞和 26 亿 * 24 字节的数据。我仍然需要一些额外的电力计算解决方案。我不是吗?

2个回答

如果您“从未涉足计算机”,那么第一步是阅读文献并了解其他人正在做什么和已经做什么。

第二步是你可能会了解到你想做的事情在今天是不可能的——至少除非你可以使用超级计算机。我怀疑今天有 30 亿个粒子是可能的,但前提是你可以同时访问几千个处理器内核。只有在您展示了编程和一次使用 1 个、10 个、100 个处理器内核的经验之后,它们才会让您使用这些处理器内核。

所以开始阅读和学习/练习并行计算吧!

从技术角度来看,您的模拟是可能的,即使非常不切实际。操作系统使用虚拟内存将资源分配从调用进程中抽象出来,但这样做的好处是,您的 4Gb RAM 对您的模拟程序来说似乎是无限的,因为操作系统将简单地将磁盘空间用于所有 RAM 内存请求不适合活动页表。如果您使用的是 linux,您可能会看到您当前的系统限制配置使用cat /proc/self/limits. 某些系统设置了默认最大值,在这种情况下调用malloc将失败并显示ENOMEM,但您可以在自己的计算机上将其配置为您想要的任何值,包括完全取消限制。

话虽这么说,磁盘访问比从 RAM 读取慢数百万倍,即使我们假设不切实际的最佳情况,即您主要进行大型顺序读取,这根本不是随机存取内存的重点。

我认为您应该弄清楚的第一件事是您要对这些粒子进行建模。如果您尝试探索它们与环境交互的物理特性,您真的需要一次对所有这些进行建模吗?这类模拟的最大障碍是状态变量的相互依赖性。毕竟,您正在尝试对交互进行建模,否则您可以简单地在超级计算机上将其并行化。如果您要减少任何时候被模拟的粒子数量,您可以将这些资源用于计算模拟数据。对粘度、流速等进行建模需要大量的计算资源,而且您拥有的资源越多,您就越能真实地模拟粒子之间的相互作用。

我在一个计算物理实验室实习过,做固态模拟,这些项目中最大的障碍是每个分子之间的相互作用量。所涉及的计算的计算复杂度可能达到 n!,因此,如果您计划从一开始就对人体中的每个血细胞进行建模,我的建议是先设计模型,然后对必要的算法进行原型制作,以低迭代次数运行小型模拟,在微调模型时根据需要重复,然后逐渐增加调查的范围或深度(但不是两者兼而有之),或者将自己冷冻到卡尔达舍夫 2 级文明显示您需要的技术。