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

StackOverflow https://stackoverflow.com/questions/567528

  •  05-09-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top