2008-08-09 5 views
5

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

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

До сих пор я нашел столбец Саттера доктора Доббса, чтобы стать хорошим началом. Я только что получил «Искусство многопроцессорного программирования» и книгу «О'Рейли» на блоках Intel Threading Building Block

ответ

5

Несколько других книг, которые будут полезны, являются:

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

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

3

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

1

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

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

2

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

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

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

0

Посмотрите на Hoard, если вы занимаетесь распределением памяти.

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

0

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

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

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

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

0

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

http://concurrency.tumblr.com