2015-10-15 2 views
2

Я читал Java Параллелизм на практике и пункт попадался, который сказал что-то вроде этого: -Ограничение распараллеливания разнородных задач

Под 6.3.4 Ограничения распараллеливания гетерогенных задачам

Еще проблема с разделением разнородных задач среди множества работников заключается в том, что задачи могут иметь разрозненные размеры. Если вы разделите задачи A и B между двумя рабочими, но A занимает в десять раз больше, чем B, вы только ускорили процесс на 9%. Наконец, разделение задачи между несколькими работниками всегда включает в себя некоторый объем накладных расходов на координацию; для того, чтобы деление было целесообразным, это надбавка должна быть более чем компенсирована повышением производительности за счет параллелизма.

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

Может кто-нибудь, пожалуйста, помогите мне понять это?

+1

Другой способ. Это должно быть меньше прироста производительности. Часть меня думает, что это может пригодиться для ELU ... – JonK

+0

Может быть перенесено на http://ell.stackexchange.com/ ;-) – Marco13

ответ

3

Нет, жирный шрифт немного меняет смысл предложения весьма существенно:

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

Если это было просто «должно быть больше, чем улучшение производительности ...», тогда вы были бы правы. Что сказано выше, так это то, что вы должны выполнить штраф за производительность, разделив задачи между вашими рабочими потоками (накладные расходы), должно быть меньше, чем увеличение производительности, которое вы получаете, делая это вообще.

Например, если ваши накладные расходы составляют 10 секунд, а коэффициент полезного действия составляет всего 5 секунд, то при параллельной операции на самом деле уменьшилось на на общую производительность. Если ваши накладные расходы составляют 10 секунд, но прирост производительности составляет 50 секунд, вы закончили сокращение на 40 секунд общего времени выполнения (то есть улучшение).

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

+1

Я думаю, что также важно отметить, что ** выделенное время ** не является единственная метрика, которую следует учитывать. Поскольку разделение может также потребовать больше процессорных часов, памяти и даже обработки ввода-вывода (если кэширование промежуточного состояния для обеспечения параллельных данных в памяти). При выполнении в одиночку ваши задачи не должны сражаться в параллелизме с использованием ресурсов компьютера другими процессами приложений. – LoganMzz

+0

@LoganMzz Вы абсолютно правы - я просто составил несколько простых чисел на месте, чтобы понять суть, я не пытался предположить, что параллелизирующий код - это простая операция :) – JonK

+1

Я думаю, что ваш ответ такой, простой, понятный и демонстративный.Я хотел бы просто добавить точность для Java-разработчика, работающего с параллельной задачей, поскольку параллелизм выполняется не только для синхронизации доступа к ресурсам. Также обратите внимание, что в частности, речь идет о _Java Concurrency in Practice_ reader. – LoganMzz

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