Где находится точка, в которой добавление дополнительных ядер или процессоров вообще не повышает производительность? - PullRequest
5 голосов
/ 21 марта 2012

* Добавление второго ядра или ЦП может повысить производительность вашей параллельной программы, но вряд ли удвоит ее.Аналогичным образом, четырехъядерный компьютер не будет выполнять вашу параллельную программу в четыре раза быстрее - отчасти из-за издержек и координации, описанных в предыдущих разделах.Однако дизайн компьютерного оборудования также ограничивает его возможности масштабирования.Можно ожидать значительного улучшения производительности, но оно не будет составлять 100 процентов на дополнительное ядро, и почти наверняка наступит момент, когда добавление дополнительных ядер или процессоров вообще не улучшит производительность.

*

Я прочитал абзац выше из книги.Но я не понимаю последнее предложение.Итак, в каком месте добавление дополнительных ядер или процессоров вообще не повышает производительность?

Ответы [ 6 ]

5 голосов
/ 21 марта 2012

Если вы берете последовательную программу и параллельную версию одной и той же программы, тогда параллельная программа должна выполнять некоторые операции, которые не выполняет последовательная программа, в частности операции, связанные с координацией операций нескольких процессоров.Они способствуют тому, что часто называют «параллельными издержками» - дополнительной работой, которую должна выполнять параллельная программа.Это один из факторов, который затрудняет ускорение в 2 раза на 2 процессорах, в 4 раза на 4 или 32000 на 32000 процессоров.

Если вы изучите код параллельной программы, вы часто найдете сегменты, которыеявляются последовательными, то есть которые используют только один процессор, в то время как другие простаивают.Существуют некоторые (фрагменты) алгоритмов, которые нельзя распараллелить, и есть некоторые операции, которые часто не распараллеливаются, но могут быть: например, операции ввода-вывода, для их распараллеливания вам нужна какая-то система параллельного ввода-вывода.Эта «последовательная дробь» обеспечивает минимальное время, необходимое для вычисления. Закон Амдала объясняет это, и эта статья предоставляет полезную отправную точку для дальнейшего чтения.

Даже если у вас есть программа, которая хорошо распараллеливает масштабирование (то есть способ ускоренияизменяется по мере увеличения числа процессоров) не равно 1. Для большинства параллельных программ размер параллельных служебных данных (или количество процессорного времени, которое отводится операциям, которые необходимы только для параллельных вычислений) увеличивается как некоторая функция числапроцессоров.Это часто означает, что добавление процессоров добавляет параллельные издержки, и в какой-то момент при масштабировании вашей программы и заданий увеличение накладных расходов компенсирует (или даже обращает вспять) увеличение мощности процессора.Статья о законе Амдала также охватывает закон Густафсона, который уместен здесь.

Я сформулировал это все в очень общих терминах, не принимая во внимание текущую архитектуру процессора и компьютера;я описываю особенности параллельных вычислений (как в настоящее время понимается), а не какой-либо конкретной программы или компьютера.

Я категорически не согласен с утверждением @Daniel Pittman о том, что эти проблемы имеют только теоретическое значение.Некоторые из нас очень усердно работают над тем, чтобы наши программы могли масштабироваться до очень большого числа процессоров (1000).И почти все разработки для настольных компьютеров и офисов в наши дни, а также большинство мобильных разработок ориентированы на многопроцессорные системы, и использование всех этих ядер является серьезной проблемой.

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

2 голосов
/ 26 марта 2012

@ High Performance Mark - это правильно. Это происходит, когда вы пытаетесь решить проблему фиксированного размера как можно быстрее, чтобы действовал закон Амдаля. Это (обычно) не происходит, когда вы пытаетесь решить проблему в установленное время. В первом случае вы готовы использовать такое же количество времени для решения проблемы

  • чей размер больше;
  • , размер которого точно такой же, как и раньше, но с большей точностью.

В этой ситуации применяется закон Густафсона.

Итак, давайте вернемся к проблемам фиксированного размера. В формуле ускорения вы можете выделить следующие компоненты:

  • Последовательные вычисления по своей сути: σ (n)
  • Потенциально параллельные вычисления: ϕ (n)
  • Накладные расходы (операции связи и т. Д.): Κ (n, p)

и ускорение для p процессоров для размера проблемы n равно

enter image description here

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

Когда это происходит, время параллельного выполнения начинает увеличиваться. Ускорение обратно пропорционально времени выполнения, поэтому его кривая начинает снижаться. Для любого фиксированного размера проблемы существует оптимальное количество процессоров, которое минимизирует общее время параллельного выполнения.

Вот как вы можете точно рассчитать (аналитическое решение в закрытом виде) момент, когда вы не получите никакой выгоды, добавив дополнительные процессоры (или ядра, если хотите). enter image description here

enter image description here

enter image description here

1 голос
/ 24 апреля 2012

Вам может пригодиться следующая статья: Хади Эсмаилзаде, et.al, «Темный кремний и конец многоядерного масштабирования», в ISCA'11, 4–8 июня 2011 г., Сан-Хосе, Калифорния, США

1 голос
/ 21 марта 2012

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

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

1 голос
/ 21 марта 2012

Если мы говорим о x86, то архитектура более или менее ограничена.@ 3 ГГц электричество проходит 10 см (на самом деле несколько меньше) на Гц, матрица имеет площадь около 1 см, компоненты должны иметь возможность переключать состояния в этом единственном Гц (1/3000000000 секунды).Текущий производственный процесс (22 нм) дает соединения, которые имеют ширину в 88 (кремний) атомов (я, возможно, неправильно это понял).Имея это в виду, вы понимаете, что с физикой здесь можно сделать гораздо больше (насколько узкой может быть взаимосвязь? 10 атомов? 20?).С другой стороны, производитель, чтобы иметь возможность продавать устройство как «более производительное», чем его предшественник, добавляет ядро, которое теоретически удваивает вычислительную мощность.

«Теоретически» не совсем верно.Некоторые специально написанные приложения подразделяют большую проблему на части, которые достаточно малы, чтобы помещаться в одно ядро ​​и его эксклюзивные кэши (L1 и L2).Часть передается ядру, и она обрабатывается в течение значительного периода времени, не обращаясь к кэш-памяти L3 или ОЗУ (которое оно разделяет с другими ядрами и, следовательно, будет причиной возникновения коллизий / узких мест).По завершении он записывает свои результаты в ОЗУ и получает новую часть проблемы для работы.

Если ядро ​​тратит 99% своего времени на внутреннюю обработку и 1% на чтение и запись в общую память (L3кэш-память и оперативная память) у вас могут быть дополнительные 99 ядер, делающие то же самое, потому что, в конечном итоге, ограничивающим фактором будет количество обращений, на которые способна общая память.Учитывая мой пример 99: 1, такое приложение может эффективно использовать 100 ядер.

При использовании более распространенных программ - офисных, т. Е. И т. Д. - дополнительная доступная вычислительная мощность вряд ли будет заметна.Некоторые части программ могут иметь меньшие части, написанные для использования преимуществ нескольких ядер, и если вы знаете, какие из них, вы можете заметить, что эти части программ намного быстрее.

3 ГГц использовался в качестве примера, потому чтохорошо работает со скоростью света 300000000 метров в секунду.Недавно я читал, что новейшая архитектура AMD могла работать на частоте 5 ГГц, но это было при использовании специальных кулеров, и даже тогда она была медленнее (обрабатывалась меньше), чем Intel i7, работающий на значительно более медленной частоте.

1 голос
/ 21 марта 2012

Ответ, конечно, «зависит», но в современном мире мультипроцессоров с разделяемой памятью короткая версия «когда трафик, координирующий разделяемую память или другие ресурсы, использует всю доступную полосу пропускания шины и / или время ЦП». .

Хотя это очень теоретическая проблема. Почти ничего не масштабируется достаточно хорошо, чтобы продолжать использовать преимущества большего количества ядер в небольших количествах. Немногие приложения выигрывают от 4, меньше от 8 и почти ни от одного из 64 ядер сегодня - намного ниже любых теоретических ограничений по производительности.

...