Масштабирование многопоточных приложений на многоуровневых компьютерах

StackOverflow https://stackoverflow.com/questions/6817

Вопрос

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

Какие ресурсы порекомендовали бы люди?

Пока что я нашел колонку Саттера Dr.Доббс - хорошее начало.Я только что получил "Искусство многопроцессорного программирования" и книгу О'Рейли о строительных блоках Intel Threading Building Blocks

Это было полезно?

Решение

Вот еще пара книг, которые могут оказаться полезными::

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

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

Другие советы

Возможно, вы захотите проверить Инструменты повышения производительности Google.Они выпустили свою версию malloc, которую используют для многопоточных приложений.Он также включает в себя хороший набор инструментов профилирования.

Джеффри Рихтер очень любит нарезать резьбу.В его книгах есть несколько глав о потоковой обработке, загляните в его блог:

http://www.wintellect.com/cs/blogs/jeffreyr/default.aspx.

Как сказал бы Монти Пайтон "а теперь о чем-то совершенно другом" - вы могли бы попробовать язык / среду, которая использует не потоки, а процессы и обмен сообщениями (без общего состояния).Одна из самых зрелых - " эрланг" (и это превосходная и веселая книга: http://www.pragprog.com/titles/jaerlang/programming-erlang).Возможно, это не совсем соответствует вашим обстоятельствам, но вы все равно можете почерпнуть много идей, которые сможете применить в других инструментах.

Для других сред:

В .Net есть F # (для изучения функционального программирования).В JVM есть Scala (который имеет актеров, очень похожих на Erlang, и является функциональным гибридным языком).Также существует фреймворк "fork join" от Doug Lea для Java, который выполняет за вас большую часть тяжелой работы.

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

Вы не упомянули, какую платформу используете, так что, возможно, этот распределитель доступен вам.(Я верю Firefox 3 использует jemalloc, даже в Windows.Значит, порты где-то должны существовать.)

Взгляните на Копить если вы выделяете много памяти.

Сверните свой собственный Список Без блокировки.Здесь есть хороший ресурс - он на C #, но идеи переносимы.Как только вы привыкнете к тому, как они работают, вы начнете видеть другие места, где их можно использовать, и не только в списках.

Когда-нибудь мне придется проверить Hoard, Google Perftools и jemalloc.На данный момент мы используем scalable_malloc из Intel Threading Building Blocks, и он работает достаточно хорошо.

Хорошо это или плохо, но мы используем C ++ в Windows, хотя большая часть нашего кода будет отлично компилироваться с помощью gcc.Если нет веской причины для перехода на redhat (основной дистрибутив Linux, который мы используем), я сомневаюсь, что это стоит головной боли / политических проблем.

Я бы с удовольствием использовал Erlang, но здесь многое нужно переделать прямо сейчас.Если мы подумаем о требованиях, предъявляемых к разработке Erlang в телекоммуникационных компаниях, то они очень похожи на наш мир (электронная торговля).Книга Армстронга есть в моей стопке для чтения :)

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

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

http://concurrency.tumblr.com

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top