chrono中multicore的并行化设计

alt text

1. 集中式DataManager + SoA 大数组

在整个并行化流程中,核心思想就是这个DataManager数据管理系统。

他的工作:它管“全局状态 + 稀疏大数组”。

ChMulticoreDataManager 是 多核后端的总控/数据枢纽 :

Tips : 一切跨模块共享的数据(刚体/粒子状态、接触、稀疏矩阵 D/D_T/M/M_inv/M_invD、右端向量 v/hf/gamma/E 等)。

核心成员是 host_container,它是“结构化数组(SoA)”——为了并行和缓存友好,每一类量都放成一大块线性数组,而不是面向对象的分散指针。

SOA

在这里补充一下什么是SOA,和SOA的作用:

SoA(Structure of Arrays,数组的结构)是一种内存布局,把“同一字段”的数据按连续的大数组存放;与之相对的是 AoS(Array of Structures,结构体的数组),把每个对象的所有字段打包成一个结构体,再把很多结构体连成数组。

SoA 的核心作用(为什么仿真里爱用它)?

  1. 缓存/预取友好

    大多数数值核是“对一个字段做同构遍历”(例如对全部速度做一次更新、对全部法向冲量做投影)。

  1. SIMD / SIMT/ GPU 合并访问
    • 向量化/AVX 需要连续数据;GPU 需要 coalesced(合并)访问。
    • SoA 把同一字段排成大块,线程束/向量寄存器能一次抓到 N 个元素;AoS 则会被“结构体步长”打散。
  2. …剩余的好处在这里不做展开了,之后看到在进行补充。

host_container:每块数据是做什么的?

1) 接触相关(NSC/SMC 双路线的共享与区分) 2) 物体/自由度 3) 约束类型与映射 4) 稀疏矩阵与动态向量(Blaze)

ChMulticoreDataManager/host_container = 多核 NSC/SMC 的“数据中台”。

2. 稀疏算子化的 Schur 乘

“Blaze”就是一个高性能的 C++ 线性代数库。(可能和VSM 数学库相似,但是有待考察)。

这个问题之前就说过,在提上日程的过程中,主要是算子化,可以减小缓存,也可以为之后并行化做好准备。

这部分在笔记chrono求解器部分的结构有所提到过,核心思想 如下:

chrono中的建模阶段是通过对不同块的矩阵进行偏移,也就是编码,然后不组装大矩阵Z,看求解器需要不,如果是直接线性求解器,类比VEROSIM中的dantzig,那么我就按照编号把大矩阵组装好,然后进行线性的求解,但是对于APGD这种迭代的求解器暂时不需要大矩阵,那么他在APGD调用相关数据时,比如N和R时,就可以根据偏移编码,读取出数据,从而进行计算,怎么编写的目的是为“既能装配、也能算子式”的通用接口层,方便不同类型求解器插拔。

Multicore 只是在 SoA 数据布局上把这套算子化思路进一步做了“视图化/批处理化”。

这里的“视图化”(views)指的是:不复制数据,而是用“切片视图”去引用SoA大数组里的一个连续(或规则)片段,并把这个片段当成“像独立矩阵/向量一样”的对象来操作。

读写都直接作用在原数组上 + 上层拿“窗口”来用(宏定义) + 底层仍是一份大数组

优点:

3. OpenMP 数据并行 + 线程自适应

4. 模块边界清晰(碰撞 ↔ 物理 ↔ 求解器)

碰撞系统在 PreProcess() 把内部 cd_data 的指针直接指向 DataManager 的外部状态数组(避免复制),Run() 后 PostProcess() 把接触/材料信息回填,再交给求解器(NSC/SMC 任选)。

关于这部分我找到了相关的文献,有待查看。

CHRONO: a parallel multi-physics library for rigid-body, flexible-body, and fluid dynamics

ChSolverMulticoreAPGD.cpp:

代码移植的可行性分析

下面这部分来源于cursorm,考虑删除

并行总体架构(Multicore 模块)

关键并行位置与职责

线程数管理与动态调优

数据流与矩阵装配(对并行的支撑)

你需要知道的并行边界

简短结论

小结