如何告诉JRE使用多个CPU节点

时间:2015-09-22 13:36:09

标签: java parallel-processing cpu supercomputers

我有一个.jar文件,我想在超级计算机上运行。有大约40个CPU节点可用,但Java在运行我的程序时只使用其中一个。有没有办法告诉Java使用所有可用的节点来运行给定的程序(最好不重新编译程序)?

1 个答案:

答案 0 :(得分:2)

默认情况下,Java始终使用所有可用的CPU。默认情况下,当您启动它时,为每个逻辑CPU创建一个线程,仅用于执行GC。

  

有大约40个CPU节点可用,但Java在运行我的程序时只使用其中一个

问题是你的程序只使用一个thred,因为这是你编写程序的方式。如果您希望程序使用更多CPU,则必须在程序中执行更多独立任务,以便它可以使用更多CPU。

  

有没有办法告诉Java使用所有可用节点来运行给定程序

是的,但你必须在你的代码中执行此操作,否则它不会神奇地使用比程序告诉​​它更多的CPU。

  

我猜是JRE的错。

20年前发布的JRE有一个阻止多线程工作的错误,并且没有人在那个时候修复它,即使大约有1000万开发人员使用它,或者你刚刚编写的只有一个人使用的程序有一个错误。哪一个听起来更容易出错?

如果您想看到可以使用机器上的所有CPU。

public class Main {
    public static void main(String[] args) {
        IntStream.range(0, 1000).parallel().forEach(i -> {
            long end = System.currentTimeMillis() + 1000;
            while (end > System.currentTimeMillis()) {
                // busy wait
            }
            System.out.println("task " + i + " finished");
        });
    }
}

这将使用您机器上的所有逻辑CPU而无需任何特殊选项。

我看到Java在运行120个CPU和3 TB主内存的服务器上运行正常。当Java程序使用多个NUMA区域时会遇到一些问题,但我怀疑这是你的问题。