Boost - Odeint:什么意味着使用 VexCL 的并发性以及如何改进它?

Boost - Odeint: What means concurrency using VexCL and how to improve it?

我的问题与tutorial which explains how to implement boost::odeint with VexCL in order to achieve concurrency (the complete code can be found here)有关。

下图是我对ODEINT迭代的看法:

现在我问自己,在 VexCL 中 究竟是什么/或者它的哪一部分被并行化了?

我的印象是,ODE 部分是一项单独的任务,因为在给定的示例中,ODE 的所有方程都在一个块中。也许集成部分在三个并行任务中运行。这导致四个任务,其中(我认为)ODE 任务是一个瓶颈(因为方程式可能变得非常大)。

如果这是正确的,我想知道,如何提高这种并发性。我认为横向结合 ODE 和 INT 是有意义的。这导致 3 个任务,每个任务都不能在此级别进一步减少。

您链接的示例正在对洛伦兹系统进行参数研究。也就是说,它求解大量具有不同参数的相同方程。状态类型是 vex::multivector<double,3>,它将许多洛伦兹系统的状态(3D 坐标)打包在一起。这是一个令人尴尬的并行问题,可以将 odeint 算法应用于锁步状态类型。也就是说,像 x += tau * dt 这样的操作,其中 xdt 是大向量,在 GPU 上执行。

有关 odeint/vexcl 实施的更多详细信息可在 [1] 中找到。 [2] 是一篇关于如何在耦合系统的情况下提取并行性的有趣论文。

[1] Ahnert、Karsten、Denis Demidov 和 Mario Mulansky。 "Solving ordinary differential equations on GPUs." 使用 GPU 进行数值计算。 Springer, Cham, 2014. 125-157。 https://doi.org/10.1007/978-3-319-06548-9_7 (pdf)

[2] 木兰斯基,马里奥。 "Optimizing Large-Scale ODE Simulations." arXiv 预印本 arXiv:1412.0544 (2014).