Как вы пользуетесь Multicore? - PullRequest
61 голосов
/ 12 декабря 2008

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

Мои вопросы:

  1. Как это влияет на ваш программный план?
  2. Меня особенно интересуют реальные истории о том, как многоядерный процессор влияет на разные программные области, поэтому укажите в своем ответе, какие разработки вы делаете ( например, на стороне сервера, клиентские приложения, научные вычисления, и т.д.).
  3. Что вы делаете со своим существующим кодом, чтобы использовать преимущества многоядерных машин, и с какими проблемами вы столкнулись? Используете ли вы OpenMP , Erlang , Haskell , CUDA , TBB , UPC или что-то еще?
  4. Что вы планируете делать, когда уровни параллелизма продолжают расти, и как вы будете иметь дело с сотнями или тысячами ядер?
  5. Если ваш домен не легко извлекает выгоду из параллельных вычислений, то объясните, почему это тоже интересно.

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

Обновление: Если вы ответите # 5, укажите, считаете ли вы, что все изменится, если будет больше ядер (100, 1000 и т. Д.), Чем вы можете обеспечить доступной пропускной способностью памяти (см. Как как пропускная способность становится все меньше и меньше на ядро). Вы все еще можете использовать оставшиеся ядра для своего приложения?

Ответы [ 22 ]

2 голосов
/ 14 июня 2009

Я считаю, что " Циклы - лучший друг инженеров ".

Моя компания предоставляет коммерческий инструмент для анализа и преображает очень большие программные системы на многих компьютерных языках. «Большой» означает 10-30 миллионов строк кода. Инструментом является набор реинжиниринга программного обеспечения DMS (DMS для краткости).

Анализ (и даже преобразования) на таких огромных системах займет много времени: наши точечные анализаторы для C Код занимает 90 часов ЦП на x86-64 с 16 ГБ ОЗУ. Инженеры хотят получить ответы быстрее, чем это.

Следовательно, мы внедрили DMS в PARLANSE , язык параллельного программирования нашего собственного дизайна, предназначен для использования небольших многоядерных общих системы памяти.

Ключевые идеи, стоящие за парлансом: а) пусть программист выставит параллелизм, б) позволить компилятору выбрать, какую часть он может реализовать, в) сохранить переключение контекста до абсолютного минимума. Статические частичные порядки по вычислениям легко помочь достичь всех 3; Легко сказать, сравнительно легко измерить затраты, легко для компилятора планировать вычисления. (Написание параллельной быстрой сортировки с этим тривиально).

К сожалению, мы сделали это в 1996 году :-( Последние несколько лет были наконец оправданием; Теперь я могу получить 8 основных машин у Фрая за $ 1K и 24 ядра машины примерно по той же цене, что и маленький автомобиль (и может быстро упасть).

Хорошая новость в том, что DMS сейчас довольно зрелая, и есть ряд ключевых внутренних механизмов в DMS, которые используют это преимущество, особенно целый класс анализаторов называют «грамматиками атрибутов», который мы пишем с использованием предметно-ориентированного языка что не парланс. DMS компилирует эти приписать грамматики в PARLANSE, а затем они выполняются параллельно. Наш фронт C ++ end использует атрибут грамматики и составляет около 100K SLOC; он скомпилирован в 800K SLOC параллельного Parlanse-код, который на самом деле работает надежно.

Теперь (июнь 2009 г.) мы довольно заняты тем, чтобы сделать DMS полезной, и не всегда есть достаточно времени, чтобы использовать параллелизм Что ж. Таким образом, 90 часов указывают на анализ. Мы работаем над этим, и есть разумная надежда на ускорение в 10-20 раз.

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

2 голосов
/ 12 декабря 2008

Моя дипломная работа заключается в разработке концепций для выполнения многоядерной работы с голым металлом и преподавания во встроенных системах.

Я также немного работаю с F #, чтобы ускорить работу моих многоуровневых языковых средств высокого уровня.

1 голос
/ 13 декабря 2008

Теперь я могу отделить свою основную операционную систему от своей разработки / установки, если захочу, используя настройки витализации с Virtual PC или VMWare.

Двухъядерное означает, что один процессор работает под управлением моей хост-ОС, а другой - под управлением моей разработки с достойным уровнем производительности.

1 голос
/ 13 декабря 2008

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

Это достаточно хорошо для нас.

1 голос
/ 24 декабря 2008

Изучение функционального языка программирования может использовать несколько ядер ... дорого.

Я думаю, что не очень сложно использовать дополнительные ядра. Существуют некоторые мелочи, связанные с веб-приложениями, которые не требуют особого внимания, поскольку веб-сервер выполняет свою работу, выполняя запросы параллельно. Вопросы касаются долгосрочных алгоритмов (длинный - это то, что вы называете длинным). Их необходимо разделить на более мелкие домены, которые не зависят друг от друга, или синхронизировать зависимости. Многие algs могут сделать это, но иногда требуются ужасно разные реализации (опять же).

Итак, нет серебряной пули, пока вы не используете императивные языки программирования, извините. Либо вам нужны квалифицированные программисты (дорого), либо вам нужно перейти на другой язык программирования (дорого). Или вам просто повезло (веб).

1 голос
/ 27 января 2010

Я решил использовать преимущества нескольких ядер в реализации алгоритма DEFLATE . MArc Adler сделал нечто похожее в коде C с PIGZ (параллельный gzip). Я поставил философский эквивалент, но в библиотеке управляемого кода, в DotNetZip v1.9 . Это не порт PIGZ, а похожая идея, реализованная независимо.

Идея DEFLATE состоит в том, чтобы сканировать блок данных, искать повторяющиеся последовательности, создавать «словарь», который отображает короткий «код» для каждой из этих повторяющихся последовательностей, а затем генерировать поток байтов, где каждый экземпляр одного из повторяющиеся последовательности заменены на «код» из словаря.

Поскольку сборка словаря требует значительных ресурсов процессора, DEFLATE является идеальным кандидатом для распараллеливания. Я использовал подход типа Map + Reduce, где я делю входящий несжатый bytestreeam на набор меньших блоков (map), скажем, по 64 КБ каждый, а затем сжимаю их независимо. Затем я объединяю полученные блоки вместе (уменьшаю). Каждый 64-килобайтный блок сжимается независимо, в своем собственном потоке, без учета других блоков.

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


Существуют накладные расходы времени выполнения (ЦП), связанные с управлением несколькими потоками, накладные расходы памяти времени выполнения, связанные с буферами для каждой команды, и накладные расходы данных, связанные с объединением блоков. Таким образом, этот подход окупается только для больших потоков. В моих тестах выше 512к, это может окупиться. Ниже этого лучше использовать последовательный подход.


DotNetZip поставляется в виде библиотеки. Моей целью было сделать все это прозрачным. Таким образом, библиотека автоматически использует дополнительные потоки, когда размер буфера превышает 512 КБ. Приложение не должно ничего делать, чтобы использовать потоки. Это просто работает, и когда потоки используются, это волшебно быстрее. Я думаю, что это разумный подход для большинства библиотек, используемых приложениями.


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


1 голос
/ 09 сентября 2009

Я использую и программирую на Mac. Grand Central Dispatch для победы. В обзоре Snow Leopard Ars Technica есть много интересного о многоядерном программировании и о том, куда идут люди (или по крайней мере Apple).

0 голосов
/ 27 января 2010
  1. Как это влияет на ваш программный план?
    Это не так. Наши (как и почти все другие) бизнес-приложения прекрасно работают на одном ядре. Пока добавление большего количества ядер существенно не снижает производительность однопоточных приложений, мы рады,

  2. ... реальные истории ...
    Как и все остальные, параллельные сборки - это главное преимущество, которое мы получаем. Компилятор Visual Studio 2008 C #, похоже, не использует более одного ядра, которое действительно отстой

  3. Что вы делаете со своим существующим кодом, чтобы использовать преимущества многоядерных машин
    Мы можем рассмотреть возможность использования параллельных расширений .NET, если у нас когда-нибудь будет длительный алгоритм, который можно распараллелить, но шансы на это на самом деле невелики. Наиболее вероятный ответ заключается в том, что некоторые разработчики будут играть с ним ради интереса, но не намного больше

  4. как вы будете иметь дело с сотнями или тысячами ядер?
    Голова -> Песок.

  5. Если для вашего домена нелегко использовать параллельные вычисления, объясните, почему это тоже интересно.
    Клиентское приложение в основном перемещает данные, серверное приложение в основном использует SQL-сервер для выполнения тяжелой работы

0 голосов
/ 03 августа 2009

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

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

0 голосов
/ 03 февраля 2009

Вы говорите: «Для веб-приложений это очень, очень просто: игнорируйте это. Если у вас нет кода, который действительно требует параллельной работы, вы можете просто написать однопоточный код старого стиля и быть счастливым». 1001 *

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

Мы еще не разрабатываем для DOS? Мы должны заняться многоядерностью, иначе мы умрем через много лет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...