科学计算中网格数据的内存布局

时间:2010-10-31 21:40:54

标签: performance software-design scientific-computing mesh flexibility

我正在开发一个有限元系统。像往常一样,模拟由一组网格节点组成,每个网格节点都有一组属性(浮点),例如几个材料属性,坐标或在时间内发展的物理量。

您可以采用两种极端方法:

  • Property-wise:为每个属性维护一个数组:

    double* x, *y, *z, *e_field, *b_field, *conductivity;

  • 以条目方式:维护一个单独的数组,其中每个数组都是struct

    struct { double x, y, z, e_field, b_field, conductivity; } *meshnodedata;

在这些之间,可以混合,例如仅对坐标x,y,z应用第二种方法,并对剩余属性使用第一种方法。模拟为每个网格节点维护的属性越多,混合的可能性就越大。

一方面,我已经得到了经典问题,这些方法(及其混合)中的哪一种最适合于计算性能和代码可维护性的科学计算。另一方面,我想知道如何以不同方法之间的迁移变得容易的方式实现代码。此外,它甚至可能是针对程序的不同部分在不同内存布局之间进行迁移的解决方案。

说到这一点:

  • 您对这些不同方法的体验是什么?
  • 这些差异有多大?
  • 您是否获得了在这两种布局之间迁移的经验?

1 个答案:

答案 0 :(得分:3)

您的问题实际上归结为如何设计灵活快速的有限元软件,这是一个积极研究的领域。我已经研究过这种软件,我认为你的问题的答案实际上取决于你想支持哪种功能。例如,您是否需要自适应网格细化和粗化?你解决了偏微分方程系统吗?您的代码应该在群集上运行吗?你有多少未知数?在不了解你的目标的情况下,无论如何我都试着制作一些通用的字体。

  1. 那里有大量的FE框架和网格管理员 - 使用其中一个!

  2. 网格管理者比许多人想象的要复杂得多。只要它只在一台计算机上以3D方式呈现,它就可能仍然是可管理的。具有3D混合元素类型的网格管理器具有局部细化和并行负载平衡是一项艰巨的任务。如果您知道要改进的网格管理器,那么只开发自己的网格管理器。

  3. 内存布局:现在我们来看实际问题:) 分离网格数据和问题数据。这将使您的代码更易于维护。网格管理器可以用于不同类型的问题,每个问题都有自己的数据集附加到每个元素。

  4. 如果你在电网内部或外面存储电导率这样的东西,就性能而言应该不重要。我会出于设计原因将其分开,而不是出于性能原因。

  5. 将未知数(可能在您的示例中为e_fieldb_field)存储在一个连续的内存块中。这将大大提高线性求解器的性能。迭代线性求解器通常受大型矩阵的内存带宽限制。

  6. 你的未知数载体的内部结构可能是分组的或块状的(基本上是你自己描述的两种方法)这两种方法中哪一种选择未知数的编号取决于许多因素,包括类型您解决的PDE和您使用的线性求解器的种类。关于这个问题,有许多科学出版物。