如何分叉几个孩子同时计算动态过程的几个时间步

时间:2018-06-16 06:34:56

标签: c algorithm math fork physics

我认为答案是“它无法完成”,但我不想在不耗尽所有可能性的情况下对项目进行编程。这里有更详细的信息......

我已经成功编程了一个模拟,其输出是动画gif,其中帧在时间步之后显示模拟系统的配置时间步长。但是在这个成功的案例中,时间步长可以独立计算,即,有一个封闭形式的解决方案,因此我不需要时间步长 t 的结果来计算 t + dt的结果等等。所以我分了几个,比如 n t,t + dt,t + 2dt,...,t +的子进程( n-1 )dt ,等待它们全部完成,然后按时间顺序组装gif帧。工作正常。

但是在这个新案例中,动态系统更复杂,并且如果没有首先在数字上计算时间步长 t ,则无法计算时间步长 t + dt 。也就是说,没有封闭形式的解决方案。因此在我看来问题是不可并行化的,并且没有重要的方法来使用多个核心。 (我可以分叉一个孩子来组装时间步长 t 的gif框架,而 t + dt 正在计算,但那是微不足道的。)我有希望错误吗?在这种情况下是否有任何有用的方法来利用多个核心?

1 个答案:

答案 0 :(得分:1)

之前我已经模拟过时间依赖的物理过程,我知道尽可能加快过程速度是可取的。虽然每个时间步的相互依赖性使得并行化变得困难,如果不是不可能的话,您仍然可以尝试在每个时间步中并行一些计算。

  • 每个时间步的算法中是否有可以并行化的循环?

  • 如果没有循环,每个时间步骤内的计算是否可以分成可以独立进行的部分?然后,您可以要求不同的核心同时执行这些操作。

  • 如果您有不同的参数/设置可供试用(通常用于发布学术论文,需要进行一些参数扫描以生成图表),您可以对这些参数进行并行化吗?时间依赖性将以这种方式排除在外。

  • 您是否有使用CPU的某些SIMD功能可能加速的阵列/矩阵操作(这是除了使用多个内核之外),如果尚未由专门的库处理?