Появление архитектуры MultiCore влияет на меня как разработчика программного обеспечения?

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

Мой вопрос:
How to deal with increasing multicore presence in day-by-day hacking?

Ответ 2

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

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

Ответ 3

Узнайте преимущества concurrency и пределы (например, закон Амдаля).

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

  • Предпочитают неизменные структуры данных, их использование упрощает понимание программ не только в параллельных программах.

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

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

Ответ 9

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

Ответ 10

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

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

Ответ 11

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

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

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

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