Влияет ли появление архитектуры MultiCore на меня как на разработчика программного обеспечения? - PullRequest
10 голосов
/ 20 февраля 2009

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

Поэтому мой вопрос:
How to deal with increasing multicore presence in day-by-day hacking?

Ответы [ 11 ]

7 голосов
/ 20 февраля 2009
4 голосов
/ 20 февраля 2009

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

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

3 голосов
/ 20 февраля 2009

Изучите преимущества параллелизма и ограничения (например, закон Амдала).

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

Бесплатный обед окончен, но это не значит, что нечего эксплуатировать.

2 голосов
/ 20 февраля 2009
  • Предпочитают неизменяемые структуры данных, их использование облегчает понимание программного обеспечения не только в параллельных программах.

  • Изучите инструменты параллелизма на вашем языке (например, java.util.concurrent, JCIP ).

  • Изучение функционального языка (например, Haskell ).

2 голосов
/ 20 февраля 2009

Изучайте Erlang / F # (в зависимости от вашей платформы)

2 голосов
/ 20 февраля 2009

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

Некоторым приложениям выгоднее тот факт, что они работают на многоядерном процессоре, чем другие. Если ваше приложение может извлечь выгоду из многоядерности, тогда вы должны быть готовы идти параллельно. Бесплатный обед окончен; то есть: в прошлом ваше приложение стало быстрее, когда был выпущен новый процессор, и вам не нужно было прикладывать какие-либо усилия в своем приложении, чтобы получить эту дополнительную скорость. Теперь, чтобы воспользоваться возможностями, предлагаемыми многоядерным процессором, вы должны убедиться, что ваше приложение может этим воспользоваться. То есть: вы должны увидеть, какие задачи могут выполняться многопоточно / одновременно, и это приводит к некоторым проблемам в таблице ...

2 голосов
/ 20 февраля 2009

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

2 голосов
/ 20 февраля 2009

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

Если вы работаете с .NET, посмотрите на Parallel Extensions. Они позволяют легко выполнять множество задач параллельного программирования.

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

Пишите меньшие программы.

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

Итак, привыкните разбивать свои проблемы на независимые компоненты, которые можно запускать в любое время.

Вы также создадите больше поддерживаемого программного обеспечения.

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

Изучение OpenMP и MPI для кода C и C ++.

OpenMP также применим и к другим языкам, например к Fortran.

...