Подтвердить что ты не робот

Программирование для многоядерных процессоров

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

мой вопрос:

Учитывая, что у вас многоядерная среда, могу ли я использовать любые методы программирования для более эффективного использования доступных ресурсов? Как мне изменить свой код, чтобы повысить производительность в многоядерных средах?

4b9b3361

Ответ 1

Это правильно. Ваша программа не будет работать быстрее (за исключением того, что ядро ​​обрабатывает меньше других процессов, потому что некоторые из процессов выполняются на другом ядре), если вы не используете concurrency. Если вы используете concurrency, тем не менее, больше ядер улучшает фактический parallelism (с меньшим количеством ядер, concurrency чередуется, тогда как с большим количеством ядер вы можете получить истинное parallelism между потоками).

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

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

Невозможно дать полный ответ о том, как писать эффективные параллельные программы на StackOverflow. Это действительно предмет, по крайней мере, одного (возможно, нескольких) курсов компьютерной науки. Я предлагаю вам зарегистрироваться на такой курс или купить книгу. Я бы рекомендовал вам книгу, если бы знал о хорошем, но курс алгоритмов паралелла, который я взял, не имел учебника для курса. Вы также можете быть заинтересованы в написании нескольких программ с использованием последовательной реализации, параллельной реализации с многопоточным (обычные потоки, пулы потоков и т.д.) И параллельной реализации с передачей сообщений (например, с помощью Hadoop, Apache Spark, Cloud Dataflows, асинхронные RPC и т.д.), а затем измерение их производительности, изменяя количество ядер в случае параллельных реализаций. Это была основная часть курса для моего курса параллельных алгоритмов и может быть довольно проницательным. Некоторые вычисления, которые вы можете попробовать распараллеливать, включают вычисление Pi с использованием метода Монте-Карло (это тривиально параллелизуемо, предполагая, что вы можете создать генератор случайных чисел, где случайные числа, сгенерированные в разных потоках, независимы), выполняя умножение матрицы, вычисляя форму эшелона строк матрицу, суммирующую квадрат числа 1... N для некоторого очень большого числа N, и я уверен, что вы можете думать о других.

Ответ 2

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

Чтобы ваша операционная система использовала несколько ядер, вам нужно сделать одну из двух вещей: увеличить количество потоков на процесс или увеличить количество процессов, выполняемых одновременно (или обоих!).

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

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

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

Ответ 3

Я не знаю, можно ли начать это с самого лучшего места, но я подписался на статью из Intel Software Network некоторое время назад и нашли там много интересного, представленного довольно простым способом. Вы можете найти некоторые основные статьи об основных понятиях параллельных вычислений, например this. Здесь у вас есть быстрое погружение в openMP, что является одним из возможных способов начать распараллеливать самые медленные части вашего приложения, не меняя остальных. (Если эти части присутствуют parallelism, конечно.) Также проверьте Руководство Intel по разработке многопоточных приложений. Или просто перейдите и просмотрите раздел статьи, статей не так уж много, поэтому вы можете быстро выяснить, что вам лучше всего подходит. У них также есть форум и еженедельный веб-трансляция, называемая параллельным программированием.

Ответ 4

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