multithreading - 优化计算中使用的 # 个线程的算法

标签 multithreading algorithm genetic-algorithm mathematical-optimization evolutionary-algorithm

我正在执行一项操作,我们称它为 CalculateSomeData。 CalculateSomeData 在连续的“世代”中运行,编号为 1..x。整个运行中的世代数由 CalculateSomeData 的输入参数固定,并且是先验已知的。一代需要 30 分钟到 2 小时才能完成。其中一些可变性是由于输入参数造成的,无法控制。然而,这种可变性的一部分是由于硬件容量、来自其他进程的 CPU 负载、网络带宽负载等因素造成的。每代可以控制的一个参数是 CalculateSomeData 使用的线程数。现在这是固定的并且可能不是最佳的。我想跟踪每一代所花费的时间,然后使用一些算法来调整线程数,以便每一代都改进上一代的计算时间(最小化时间)。我应该使用什么方法?遗传算法的适用性如何?直觉告诉我,这个范围会相当小——在双四核处理器机器上可能有 1 到 16 个线程。

非常感谢任何指针、伪代码等。

最佳答案

进化算法怎么样。

从猜测开始。每个 CPU 核心 1 个线程似乎不错,但取决于手头的任务。

测量生成中每个任务的平均时间。将其与上一代所花费的时间进行比较。 (假设第 0 代有效无限时间和 0 个线程)。

如果最近一代任务的平均时间比前一代更好,继续按照上一步的相同方向更改线程数(因此,如果上一代的线程比前一代线程多,则添加新一代的线程,但如果它更少,则少使用一个(显然下限为 1 个线程)。

如果最近一代的任务平均比上一代花费的时间更长,则以相反的方向改变线程数(所以如果增加线程数导致时间更糟,下次使用更少的线程) .

只要最佳线程数不太接近 1,那么您最终可能会在 3 个都合理接近最佳值的值之间摇摆不定。如果您要处理大量代数,您可能想要明确检测这种情况并将自己锁定在中心值中。

关于multithreading - 优化计算中使用的 # 个线程的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3761646/

相关文章:

java - 如何保护一种方法免受不同请求的影响

java - Java 中线程中断的结果不可重复

algorithm - 用于设计和建模复杂系统的工具

algorithm - 打印到达第 n 个楼梯的方法

algorithm - 防止零和博弈中的遗传算法合作

genetic-algorithm - 为什么我的遗传算法很糟糕(为什么不收敛)?

java - 如何使用 Spring-Boot 清除所有 @Async 任务的已完成 Future 结果?

c++ - QAbstractItemModel 线程安全

c++ - 我的最小生成树实现中的错误

algorithm - 是否可以使用遗传编程找到一系列方程?