为什么在大约10个内核之后添加内核会减慢我的java程序?
发布时间:2020-12-15 02:36:04 所属栏目:Java 来源:网络整理
导读:我的程序使用fork / join,如下所示运行数千个任务: private static class Generator extends RecursiveTaskLong { final MyHelper mol; final static SatChecker satCheck = new SatChecker(); public Generator(final MyHelper mol) { super(); this.mol =
我的程序使用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方法也使用本机库.就MyHelper类而言,任务之间没有共享变量或同步. 我使用linux中的taskset命令来限制我的应用程序使用的核心数.我通过使用大约10个核心(比如大约60秒)获得最佳速度.这意味着使用10个以上的内核会导致应用程序变慢,因此16个内核可以同时完成6个内核(大约90秒). 我更困惑,因为所选内核100%忙碌(除了垃圾收集之外). PS:我在Scala / akka中也使用了ThreadPoolExecutor,但结果相似(虽然比fork / join慢) PPS:我的猜测是,在MyHelper或SatCheck深处,有人穿过内存屏障(中毒缓存).但是我怎样才能找到并修复或去做呢? 解决方法
由于将线程/任务分配给不同的核心,可能会出现过载.此外,您确定您的程序完全可并行化吗?实际上,某些程序不能总是100%有效地使用所有可用的cpu,并且分配任务所花费的时间可能会使程序减慢而不是帮助它.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |