gpt4 book ai didi

java - 为什么在大约 10 个内核后添加内核会使我的 Java 程序变慢?

转载 作者:搜寻专家 更新时间:2023-11-01 03:42:10 24 4
gpt4 key购买 nike

我的程序使用如下所示的 fork/join 来运行数千个任务:

private static class Generator extends RecursiveTask<Long> {
final MyHelper mol;
final static SatChecker satCheck = new SatChecker();

public Generator(final MyHelper mol) {
super();
this.mol = mol;
}

@Override
protected Long compute() {
long count = 0;
try {
if (mol.isComplete(satCheck)) {
count = 1;
}
ArrayList<MyHelper> molList = mol.extend();
List<Generator> tasks = new ArrayList<>();
for (final MyHelper child : molList) {
tasks.add(new Generator(child));
}
for(final Generator task : invokeAll(tasks)) {
count += task.join();
}
} catch (Exception e){
e.printStackTrace();
}
return count;
}
}

我的程序大量使用第三方库来实现 isComplete 和 extend 方法。 extend 方法也使用本地库。就 MyHelper 类而言,任务之间没有共享变量或同步。

我使用 Linux 中的 taskset 命令来限制我的应用程序使用的内核数量。我通过使用大约 10 个内核(比如大约 60 秒)获得了最佳速度。这意味着使用超过 10 个内核会导致应用程序变慢,例如 16 个内核与 6 个内核同时完成(大约 90 秒)。

我比较困惑,因为选定的核心 100% 忙(除了偶尔进行垃圾收集)。有谁知道什么会导致这种放缓?我应该去哪里解决这个问题?

PS:我也在 Scala/akka 中使用 ThreadPoolExecutor 进行了实现,但结果相似(虽然比 fork/join 慢)

PPS:我的猜测是在 MyHelper 或 SatCheck 的深处,有人跨越了内存障碍(缓存中毒)。但是我怎样才能找到它并解决它呢?

最佳答案

由于将线程/任务分配给不同的内核,可能会出现过载。另外,您确定您的程序是完全可并行化的吗?事实上,某些程序不能总是 100% 有效地使用所有可用的 CPU,并且分派(dispatch)任务所花费的时间可能会减慢程序的速度而不是帮助它。

关于java - 为什么在大约 10 个内核后添加内核会使我的 Java 程序变慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11674290/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com