Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Optaplanner-具有多个解算器的多线程_Java_Multithreading_Optaplanner - Fatal编程技术网

Java Optaplanner-具有多个解算器的多线程

Java Optaplanner-具有多个解算器的多线程,java,multithreading,optaplanner,Java,Multithreading,Optaplanner,我在多线程下运行Optaplanner,试图利用多个CPU核。其思想是:让优化器在有限的时间内运行,跨线程选择最佳解决方案,可能进行迭代(如建议的)。我知道这与并行运行优化本身不同,我也知道并行优化在Optaplanner路线图中。问题是——在同样的时间里,当我并行运行时,我得到的分数一直较低。我使用的线程越多,情况就越糟。为了重现这个问题,我更改了CloudBalancingHelloWorld类,类似于: public static void main(String[] args) {

我在多线程下运行Optaplanner,试图利用多个CPU核。其思想是:让优化器在有限的时间内运行,跨线程选择最佳解决方案,可能进行迭代(如建议的)。我知道这与并行运行优化本身不同,我也知道并行优化在Optaplanner路线图中。问题是——在同样的时间里,当我并行运行时,我得到的分数一直较低。我使用的线程越多,情况就越糟。为了重现这个问题,我更改了
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示例中发生的事情-它更容易/更清晰地再现。