LINUX.ORG.RU

Параллельные вычисления java

 


1

2

Кто может подсказать как в джаве потоки распределяются по ядрам?

Конкретно интересуют 2 вопроса:

1. Отчего время выполнения подсчета суммы чисел в массиве в 4 потока по сравнению с одним потоком сильно разнится (иногда быстрее в 4 раза (как и предполагается), иногда всего в 2)?

2. Какой-нибудь язык позволяет распределять вручную по ядрам потоки? Или же этим заведует ОС?

Перемещено mono из talks



Последнее исправление: maxcom (всего исправлений: 1)

Java использует системные треды. В JDK нет API для прикрепления потоков к ядрам.

maxcom ★★★★★
()
Ответ на: комментарий от maxcom

Java использует системные треды. В JDK нет API для прикрепления потоков к ядрам.

Благодарю!

Simtik
() автор топика

Или же этим заведует ОС?

Через системные вызовы.

Deleted
()

1. Отчего время выполнения подсчета суммы чисел в массиве в 4 потока по сравнению с одним потоком сильно разнится (иногда быстрее в 4 раза (как и предполагается), иногда всего в 2)?

для «чистых» вычислений в седьмой джаве есть отличный Fork/Join Framework (http://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html).
Попробуй его и сравни скорость.

kovrik ★★★★★
()

Отчего время выполнения подсчета суммы чисел в массиве в 4 потока по сравнению с одним потоком сильно разнится (иногда быстрее в 4 раза (как и предполагается), иногда всего в 2)?

Нужно смотреть код. Например если ты разделишь элементы, на те, у которых четные и нечетные индексы, то из-за сброса кешей не получишь практически никакого прироста производительности на такой легковесной операции как сложение массива.

Если разобьешь по частям - уже лучше. Но сложение настолько быстрая операция, что можно моментально складывать сотни мегабайт чисел, потому если массив меньше, то опять можно наткнуться на больший оверхед работы с памятью чем самих вычислений.

Ну, а если массивы составляют десятки гигабайт, тогда все будет скорее всего плавно.

Какой-нибудь язык позволяет распределять вручную по ядрам потоки? Или же этим заведует ОС?

Такое редко нужно, но когда нужно, тогда придется делать нативный вызов и писать обертку самому

Java тут ни при чем если что

vertexua ★★★★★
()
Ответ на: комментарий от vertexua

Если разобьешь по частям - уже лучше.

Где-то слышал, что на ccNUMA архитектуре таки лучше наоборот, что бы для оного потока элементы шли не последовательно. Типа излишнее использование кешей в таких процах нагружает внтренние шины процессора. Но это так, из разряда где-то слышал :)

dizza ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.