2016-05-11 3 views
-3

У меня вопрос о многопоточности (параллелизме) в java. В самом деле, я осуществил две программы для вычисления множества Мандельброта:Многопоточные вычисления в Java

  1. Первые запуски п потоков и каждый поток вычисляет часть высоты Мандельброта (пример: https://www.logre.eu/mediawiki/images/4/49/Mandelbrot_h_block.png).

  2. Вторая запускает пул из n потоков, где каждый поток вычисляет линию пикселей Мандельброта (пример: https://www.logre.eu/mediawiki/images/f/f2/Mandelbrot_horizontal.png).

Я сделал другое профилирование на машине двух ядер, и я не понимаю, почему первая программа быстрее, чем второй, если число потоков (п) больше, чем количество ядер. Это наоборот, если число потоков меньше, чем количество ядер.

Может ли кто-нибудь мне помочь?

Примечание: существует ли ограничение потоков для вычисления этой программы?

+2

Отсутствует вся необходимая деталь. Не видя кода или как его профилировать, мы не знаем, что вы сделали это правильно и честно. Не видя таймингов, мы не знаем, насколько значительна разница. Мы даже не знаем 'n'. – weston

ответ

0

Вы сравниваете яблоки и апельсины. Две различные реализации и даже разные числа потоков.

Вы не должны использовать больше потоков, чем ядра процессора, которые имеют ваш компьютер. Если n >> число ядер ЦП, большая часть использования ЦП будет посвящена переключению контекста между потоками.

1

Поскольку потоки в пуле потребляют то же количество памяти, что и отдельные потоки, преимущество заключается в переключении ctx и в том, как пул потоков создает/удаляет активные потоки. Если у вас есть гораздо больше потоков, чем ядра для их запуска, программа будет тратить слишком много времени на переключение контекста.

Если вы скажете, что 1000 потоков на 2 ядра (как вы сказали), у вас будет слишком много переключений контекста, и по этой причине пул потоков будет работать лучше.

Так что я думаю, что вы не создаете столько потоков в обоих случаях, и разница не примечательна.

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

Проверьте количество потоков, которые вы можете вычислить в другом post.

0

Я не думаю, что вы должны пытаться делать какие-либо претензии по поводу ряда нитей меньше или больше, чем количество ядер, если это проверить только на двухъядерном машине, по двум причинам

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

  • Что еще более важно, без тестирования на машине с различным количеством ядер, вы не можете знать, имеет ли он больше или меньше потоков, чем ядра, или всего более или менее двух потоков.

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

Смежные вопросы