我想知道有效存储(并随后访问)具有可变长度的多维数据数组集的最佳实践。重点是性能,但我还需要能够在运行时处理更改单个数据集的长度,而不会产生太多开销。
注意:我知道这是一个有点冗长的问题,但我已经环顾四周,找不到足够准确地描述手头问题的解决方案或示例。
背景
上下文是基于不连续 Galerkin 谱元法 (DGSEM) 的计算流体动力学 (CFD) 代码(参见 Kopriva (2009),实现偏微分方程的谱方法)。为简单起见,让我们假设一个 2D 数据布局(实际上是三个维度,但从 2D 到 3D 的扩展应该很简单)。
我有一个网格,它由可以具有不同(物理)大小的K
方形元素k
( ) 组成。k = 0,...,K-1
在每个网格元素(或“单元格”)k
中,我都有N_k^2
数据点。N_k
是每个维度中数据点的数量,并且可以在不同的网格单元之间变化。
在每个数据点n_k,i
(其中i = 0,...,N_k^2-1
),我必须存储一个解决方案值数组,该数组nVars
在整个域(即各处)中具有相同的长度,并且在运行时不会改变。
尺寸和变化
网格单元的数量K
可以O(10^5)
在运行时更改O(10^6)
。每个网格单元中
的数据点数量介于两者之间,并且可以在运行时更改(并且对于不同的单元格可能不同)。存储在每个网格点
的变量数量大约是并且在运行期间不能改变(每个网格单元也是相同的)。N_k
2
8
nVars
5
10
要求
性能是这里的关键问题。我需要能够以一种有效的方式以有序的方式定期迭代所有单元格的所有网格点(即没有太多的缓存未命中)。通常,K
并且N_k
在模拟过程中不会经常更改,因此例如可以选择用于所有单元和数据点的大型连续内存块。
但是,我确实需要能够在运行时细化或粗化网格(即删除单元格并创建新单元格,新单元格可能会附加到末尾)。我还需要能够更改近似顺序N_k
,因此我为每个单元存储的数据点数量也可以在运行时更改。
结论
任何输入表示赞赏。如果您有自己的经验,或者只是知道一些我可以查看的好资源,请告诉我。然而,虽然解决方案对最终程序的性能至关重要,但这只是众多问题之一,因此解决方案需要具有应用性,而不是纯粹的学术性。
如果这是问这个问题的错误地点,请告诉我更合适的地点。