首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >科学计算中网格数据的内存布局

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

Stack Overflow用户
提问于 2010-10-31 21:40:54
回答 1查看 157关注 0票数 1

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

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

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

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

  • Entry-wise:维护一个单一数组,其中每个数组都是结构化的。

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

在这两者之间,可以混合使用,比如只对坐标x、y、z应用第二种方法,对其余的属性使用第一种方法。您的模拟为每个网格节点维护的属性越多,混合的可能性就越大。

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

切中要害:

有什么不同的approaches?

  • How有显著的差异吗?

  • ,您在这两种布局之间迁移的经验吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-10-31 22:30:48

你的问题实际上归结为如何设计灵活和快速的有限元软件的问题,这是一个积极的研究领域。我曾经研究过这类软件,我认为你的问题的答案实际上取决于你想要支持什么样的特性。例如,您需要自适应网格细化和粗化吗?你会解决政策制定和评价系统吗?您的代码应该运行在集群上吗?你会有多少未知数?在不知道你的目标的情况下,我还是试着做一些一般性的讨论。

  1. 有很多FE框架和网格管理器--使用其中之一!
  2. 网格管理器比许多人想象的要复杂得多。只要它只在一台电脑上是3D的,它可能仍然是可管理的。具有局部细化和并行负载平衡的三维混合单元类型的网格管理器是一项艰巨的任务。只有当您知道想要改进的时候,才能开发自己的网格管理器,而不是那些易于使用available.
  3. Memory布局的网格管理器:现在,我们讨论实际问题:)

分离网格数据和问题数据。这将使您的代码更易于维护。网格管理器可以用于处理不同类型的问题,每个问题都有自己的一组数据附加到每个元素上。如果您在网格内部或外部存储诸如电导率之类的东西,则

  • 对性能没有多大影响。由于设计原因,而不是性能原因,我会将它分开。

  • 将您的未知数(在您的示例中可能是e_fieldb_field )存储在一个连续的内存块中。这将极大地提高线性求解器的性能。迭代线性求解器通常受到内存带宽的限制,因为您的未知向量的内部结构可能是分组的或按块的(基本上是您自己描述的两种方法),这两种方法中的哪一种选择未知数取决于许多因素,包括您求解的matrices.

  • The类型和您使用的线性求解器的类型。关于这个问题,有许多科学著作。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4065283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档