对于不连续的基于 Galerkin 的模拟,我需要将基于单元的模拟数据存储在内存中。由于多项式近似的阶数可能在单元之间有所不同,我想知道如果典型的访问模式是对所有单元的循环,最有效的数据结构是什么?这些是我到目前为止的想法:
1)使用单元对象数组,每个对象都有一个指向其(单独分配的)模拟数据数组的指针
Pro:非常容易在算法上处理,在为数据存储预分配内存时不头疼,非常容易存储单元之间的拓扑关系(即邻居信息),直接直接访问特定小区。
缺点:循环遍历所有单元格时非常(非常?)慢,因为每次都可能缓存未命中。
2)使用单元对象数组,每个对象都有一个指向其模拟数据数组的指针(内存预分配和单元数据连续存储)
Pro:同上。也可能更快,因为数据现在在内存中是连续的。
缺点:仍然比仅使用数组慢,因为每个单元访问仍然需要的知识。
3) 为每组具有公共
Pro 的单元格使用一个数组(或一个 STL 容器):每个容器可以连续包含数据,因此如果先遍历,然后再遍历单元格,将会有很多缓存命中。缺点:如果需要内存预分配,则很困难。仅使用小区 ID 的随机小区访问变得非常昂贵。
有没有人有上述方法之一的经验,或者有更好的选择?如果您需要有关例如数据访问模式的更多信息,请告诉我。
注意:这个问题与 Stackoverflow 上的这个问题类似,但经过改写和简化。