1

我想在 python 中实现一个在线递归并行算法。

所以每次我得到一个新的观察结果时,我都想计算一个新的系数矩阵。该矩阵上的每一行都必须并行计算。

为每个时间步创建一个新进程是否太昂贵,该进程将前一个时间步的行作为输入并计算下一个时间步的行并在计算之后将其杀死并再次创建它?

还是让进程一直运行更好?如果第二个是两者中最好的,我怎样才能恢复相同的过程但输入不同?

有什么办法吗?

4

1 回答 1

0

为每个时间步创建一个新过程是否太昂贵......?

是的,这总是很昂贵,而且通常非常昂贵。不让您为每个时间片处理支付恒定间接费用的持久性流程在这里是一个更有希望的选择,但还必须首先考虑许多其他因素。

所有流程实例化/终止开销成本都越高,计算任务的数学密集度/复杂性就越低。因此,如果您的处理在[TIME]-domain 中很便宜,那么所有间接费用看起来都会更加昂贵(因为您的处理将不得不连续多次花费它们......)

所有进程实例化还将为[SPACE]域中数据的内存(重新)分配支付显着的开销成本(虽然具有可行的半持久数据结构,持久进程可以使用,就地矩阵运算符可以节省您在避免内存分配开销方面有很多...关于大规模矩阵的非常重要的主题,例如 FEM、ANN、视频/图像内核应用程序的数值数学处理等。)


不要仅仅依靠自己的直觉。

在决定这个设计困境之前,在重新制定的阿姆达尔定律中查看这个逻辑的所有细节,以获得所有的量化数字。对每个处理阶段进行基准测试,包括流程实例化,包括内存传输成本(在参数中),包括计算阶段的处理成本“内部”向前一步计算的处理,包括重新分配的成本所有涉及的交易对手的结果。

只有接下来,您才能定量确定一个收支平衡点,之后更多的进程将不会改善处理(将停止降低整体持续时间,并将开始增加比并行进程加速计算可能覆盖的更多开销成本) .


让进程一直运行会更好吗?

一旦避免支付流程实例化和终止的重复成本,这可能会有很大帮助。

然而,在所有此类计算服务流程之间进行信号传输和数据重新传播是有成本的。接下来,所有进程都必须放在一个真正的 RAM 中,以免在换出/换入[SPACE]动机的潮汐波中丢失,这些潮汐流的速度非常缓慢,并且会扼杀所有[TIME]动机性能提高的想法。


做基准+矢量化+最佳,JIT/LLVM-编译代码。必须的 !

鉴于 python 是您的选择,这是您提高性能的最强力量。如果你对性能很认真,这里就不用多说了。numpy+numba非常适合这个。如果为已经执行的代码剃掉最后几个[ns],调用接口的狭窄专业化和更好的矢量化对齐(缓存友好性)是您的工具。

于 2018-03-05T19:36:20.770 回答