Ответ 1
Herb Sutter написал об этом в 2005 году: Свободный обед закончился: фундаментальный поворот к Concurrency в Software
Как разработчик программного обеспечения, работающий в основном с языками программирования высокого уровня, я не уверен, что я могу сделать, чтобы должным образом обратить внимание на предстоящее многозначное присутствие многоядерных компьютеров. Я пишу в основном обычные и не требовательные приложения, тем не менее, я думаю, важно знать, нужно ли мне менять какие-либо парадигмы программирования или даже язык, чтобы овладеть будущим.
Мой вопрос: How to deal with increasing multicore presence in day-by-day hacking?
Herb Sutter написал об этом в 2005 году: Свободный обед закончился: фундаментальный поворот к Concurrency в Software
Большинство проблем не требуют большого количества процессорного времени. Действительно, одиночные ядра достаточно быстры для многих целей. Когда вы обнаружите, что ваша программа слишком медленная, сначала просмотрите ее и посмотрите на свой выбор алгоритмов, архитектуры и кеширования. Если этого недостаточно, попробуйте разделить проблему на отдельные процессы. Часто это стоит делать просто для изоляции разломов и поэтому вы можете понять использование ЦП и памяти для каждого процесса. Кроме того, как правило, каждый процесс запускается на конкретном ядре и хорошо использует кэши процессора, поэтому вам не придется испытывать существенные накладные расходы, чтобы поддерживать непрерывность строк кэша. Если вы идете на многопроцессорный дизайн и по-прежнему обнаруживаете, что проблема требует большего времени процессора, чем у вас на машине, у вас есть возможность расширить ее работу над кластером.
Бывают ситуации, когда вам нужно несколько потоков в одном и том же адресном пространстве, но будьте осторожны, что потоки действительно трудно получить. Условия гонки, особенно на небезопасных языках, иногда требуют отладки недель; часто простое добавление трассировки или запуск под отладчиком изменяет тайминги, чтобы скрыть проблему. Простое размещение блокировок повсюду часто означает, что вы получаете много блокировок накладных расходов, а иногда и столько разводов, что вы действительно не получаете преимущества concurrency, на которые вы надеялись. Даже если у вас есть права на блокировку, вам необходимо настроить профиль для согласования кеширования. В конечном счете, если вы хотите действительно настроить некоторый высококонкурентный код, вы, вероятно, столкнетесь с конструкциями без блокировки и более сложными схемами блокировки, чем в существующих многопоточных библиотеках.
Узнайте преимущества concurrency и пределы (например, закон Амдаля).
Таким образом, вы можете, по возможности, использовать единственный путь для повышения производительности, который будет открыт. Существует много инновационной работы, которая происходит на более простых подходах (фьючерсы и библиотеки задач), а старая работа заново открыта (функциональные языки и неизменные данные).
Свободный обед закончился, но это не значит, что нечего эксплуатировать.
В общем, станьте очень дружелюбными с потоками. Это ужасный механизм распараллеливания, но это то, что у нас есть.
Если вы работаете с .NET, посмотрите на Parallel Extensions. Они позволяют легко выполнять множество задач параллельного программирования.
Чтобы извлечь выгоду из того, что только одно ядро, вы должны рассмотреть возможность распараллеливания кода. Несколько новых, неизменяемых типов и минимальная синхронизация - ваши новые друзья.
Я думаю, это будет зависеть от того, какие приложения вы пишете.
Некоторые приложения приносят больше пользы от того, что они запускаются на процессоре mutli-core, а затем других. Если ваше приложение может извлечь выгоду из многоядерного факта, тогда вы должны быть готовы к параллельной работе. Свободный обед закончился; то есть: в прошлом ваше приложение стало быстрее, когда был выпущен новый процессор, и вам не пришлось прикладывать никаких усилий в своем приложении, чтобы получить дополнительную скорость. Теперь, чтобы воспользоваться преимуществами многоядерных процессоров, вы должны убедиться, что ваше приложение может воспользоваться им. То есть: вы должны видеть, какие задачи могут выполняться многопоточно/одновременно, и это приводит к возникновению некоторых проблем в таблице...
Изучите Erlang/F # (в зависимости от вашей платформы)
Мне задали тот же вопрос, и ответ: "это зависит". Если ваш Джо Winforms, может быть, не так много. Если ваш код написания должен быть выполнен, да. Одна из самых больших проблем, которую я вижу при параллельном программировании, заключается в следующем: если что-то не может быть парализовано, и вы лжете и говорите, что время выполнения должно выполняться параллельно, оно не будет терпеть крах, это просто сделает что-то неправильно, и вы получите результаты дерьма и обвините фреймворк.
Изучите OpenMP и MPI для кода C и С++.
OpenMP также применяется к другим языкам, а также к Fortran, я полагаю.
Напишите меньшие программы.
Другие языки/стили кода позволят вам делать многопоточность лучше (хотя многопоточность по-прежнему очень сложна на любом языке), но большая выгода для обычных разработчиков IMHO - это возможность выполнять множество небольших программ одновременно, чтобы выполнить гораздо больше задача.
Итак, привыкните разбивать свои проблемы на независимые компоненты, которые можно запускать, когда захотите.
Вы также создадите более удобное программное обеспечение.