Причины сублинейного ускорения в параллельных программах - PullRequest
2 голосов
/ 20 мая 2011

По каким причинам параллельная программа не достигает идеального ускорения?

Например, я думал о зависимостях данных, стоимости передачи данных между потоками (или участниками), синхронизации для доступа к тем же структурам данных, любых других идеях (или подкатегориях причин, о которых я говорил)?

Меня особенно интересуют проблемы, возникающие в модели актера Эрланга, но любые другие вопросы приветствуются.

Ответы [ 3 ]

5 голосов
/ 20 мая 2011

Несколько в произвольном порядке:

  1. Совместное использование строки кэша - несколько переменных в одной и той же строке кэша могут вызвать перегрузку между процессорами, даже если теоретическая модель утверждает, что они должны быть независимыми.
  2. Затраты на переключение контекста - если у вас больше потоков, чем в ядрах, при переключении контекста будут накладные расходы.
  3. Проблемы масштабируемости ядра: ядра могут быть хорошими, скажем, на 4 ядрах, но менее эффективными на 8.
  4. Замок транспортировочный
  5. Закон Амдала - Предел параллельного ускорения программы - это доля программы, которая может распараллеливаться.
4 голосов
/ 20 мая 2011

Одна из причин заключается в том, что распараллеливание программы зачастую сложнее, чем можно себе представить, и может возникнуть много тонких проблем. Для очень хорошего обсуждения этого см. Закон Амдала .

2 голосов
/ 23 мая 2011

Основная проблема в модели Erlang Actor состоит в том, что каждый процесс имеет свою собственную кучу памяти, а передаваемые сообщения копируются.В отличие от обычного способа использования разделяемой памяти, где вы можете передавать указатель на структуру между процессами.

В среде разделяемой памяти программист должен убедиться, что работает только один процесс / потокчасть памяти за один раз.То есть некоторый процесс обозначен как it и несет ответственность за правильные действия в этой области памяти.Не так уж много в Эрланге: один процесс не может от design копаться в областях памяти других процессов, и вы должны копировать значения в другие процессы.Это очень важно, когда мы рассматриваем надежность программ, но не настолько, если учитывать скорость выполнения программы.С другой стороны, если нам нужна распределенная среда из нескольких компьютеров, копирование правит королем и является единственным способом передачи данных между компьютерами.

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

...