У меня есть .jar-файл, который я хочу запустить на суперкомпьютере. Доступно около 40 узлов ЦПУ, но Java использует только один из них при запуске моей программы. Есть ли способ сказать Java использовать все доступные узлы для запуска данной программы (желательно без перекомпиляции программы)?Как сказать JRE использовать более одного узла CPU
ответ
Java всегда использует все доступные процессоры по умолчанию. По умолчанию при запуске он создает поток для каждого логического процессора только для выполнения GC.
Есть около 40 узлов процессора доступны, но Java использует только один из них при запуске моей программы
Проблема заключается в том, что ваша программа использует только один thred, потому что, как вы написали программу. Если вы хотите, чтобы ваша программа использовала больше процессоров, вам придется выполнять более независимые задачи в своей программе, чтобы она могла использовать больше процессоров.
Есть ли способ сказать Java, чтобы использовать все доступные узлы для запуска данной программы
Да, но вы должны сделать это в коде, в противном случае он не будет волшебно использовать больше CPU, о которых говорит ваша программа.
JRE неисправность думаю.
Либо JRE, который был выпущен 20 лет назад есть ошибка, которая останавливает многопоточную работу, и никто не зафиксировал это в то время, хотя около 10 миллионов разработчиков использовать его, или вашу программу, которую вы только что написали, которые только у одного человека есть ошибка. Какой из них звучит, как правило, имеет ошибку?
Если вы хотите видеть, что вы можете использовать все процессоры на вашем компьютере.
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");
});
}
}
Это будет использовать все логические процессоры на вашем компьютере без каких-либо специальных опций.
Я видел, что Java работает на серверах с 120 процессорами и 3 ТБ основной памяти в производственной работе просто отлично. Вы сталкиваетесь с некоторыми проблемами, когда у вас есть Java-программа, использующая несколько областей NUMA, но я сомневаюсь, что это ваша проблема здесь.
Это, конечно, не однопоточное. – Reza
@Reza, создающий несколько потоков, не означает, что существует несколько потоков, которые могут выполнять полезную работу одновременно. –
Обновление до Java8, которое имеет функциональные возможности, позволяющие использовать несколько узлов. – Stultuske
. Бесплатный обед закончился. Http://www.gotw.ca/publications/concurrency-ddj.htm –
Кроме того, ваше программное обеспечение является многопоточным , правильно? Переход на Java 8 не даст вам ничего, если ваше программное обеспечение работает в одном потоке. Тогда вы должны запустить несколько экземпляров, по одному на ядро, и убедиться, что они должным образом организованы, если это необходимо. – cjstehno