Java Optaplanner-具有多个解算器的多线程
我在多线程下运行Optaplanner,试图利用多个CPU核。其思想是:让优化器在有限的时间内运行,跨线程选择最佳解决方案,可能进行迭代(如建议的)。我知道这与并行运行优化本身不同,我也知道并行优化在Optaplanner路线图中。问题是——在同样的时间里,当我并行运行时,我得到的分数一直较低。我使用的线程越多,情况就越糟。为了重现这个问题,我更改了Java Optaplanner-具有多个解算器的多线程,java,multithreading,optaplanner,Java,Multithreading,Optaplanner,我在多线程下运行Optaplanner,试图利用多个CPU核。其思想是:让优化器在有限的时间内运行,跨线程选择最佳解决方案,可能进行迭代(如建议的)。我知道这与并行运行优化本身不同,我也知道并行优化在Optaplanner路线图中。问题是——在同样的时间里,当我并行运行时,我得到的分数一直较低。我使用的线程越多,情况就越糟。为了重现这个问题,我更改了CloudBalancingHelloWorld类,类似于: public static void main(String[] args) {
CloudBalancingHelloWorld
类,类似于:
public static void main(String[] args) {
SolverFactory solverFactory = SolverFactory.createFromXmlResource("org/optaplanner/examples/cloudbalancing/solver/cloudBalancingSolverConfig.xml");
CloudBalance unsolvedCloudBalance = new CloudBalancingGenerator().createCloudBalance(400, 1200);
CloudBalance[] cbarray = new CloudBalance[8];
Arrays.fill(cbarray, unsolvedCloudBalance);
Arrays.stream(cbarray)
.parallel()
.map(cb -> {
Solver solver = solverFactory.buildSolver();
solver.solve(cb);
return solver.getBestSolution();
})
.forEach(
solvedCloudBalance -> System.out
.println("\nSolved cloudBalance with 400 computers and 1200 processes:\n"
+ solvedCloudBalance.getScore()));
;
}
在配置中
<termination>
<secondsSpentLimit>30</secondsSpentLimit>
</termination>
30
我认为这可能是一个性能问题,但是我记录了移动的数量,每个线程的移动量是相同的——而且我在机器上有12个可用的物理内核,RAM比我需要的多得多。知道我做错了什么吗 所以你在12核机器上并行运行8?如果在12核的机器上运行6会怎么样?我会为操作系统留下至少一个CPU。在超线程内核(或者类似的东西)上,我记得一个例子,独立cpu的实际数量是cpu计数除以2。这就是为什么我要问6个并行线程的行为。1个线程、6个线程和8个线程的ACC(平均计算计数)是多少?如何确保并行线程中的每个CB配置都不同?只是环保型生产?我建议实际使用不同参数的不同算法(LA vs SA vs TS)。谢谢你的建议!顺序:1)我实际上有12个物理内核(超线程到24个),所以我的猜测是——我这里并不缺少资源。我还尝试了2、4和8个线程,线程越多,性能越差。2) 我会拿到ACC并发回3)是的,我正在使用环境模式生产。我也可以尝试不同的算法,但是仍然很好奇为什么它会这样。我假设在优化过程中克隆了解决方案,并且我使用不同的解算器,因此应该没有依赖关系。我会继续挖掘:-)现场。ACC随着线程数的增加而变得更糟。8螺纹40K,4螺纹46K,2螺纹52K。这是正常的行为吗?我可以通过配置文件检查代码是否存在瓶颈,任何建议在这里都值得赞赏:-)上次我对代码进行配置时,唯一突出的方法是我的分数计算功能(正如我所期望的那样),但是我更喜欢理解cloudbalance示例中发生的事情-它更容易/更清晰地再现。