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

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

мой вопрос,

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

16
задан Chathuranga Chandrasekara 18 March 2010 в 06:20
поделиться

4 ответа

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

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

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

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

15
ответ дан 30 November 2019 в 22:02
поделиться

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

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

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

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

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

3
ответ дан 30 November 2019 в 22:02
поделиться

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

0
ответ дан 30 November 2019 в 22:02
поделиться

Не знаю, лучшее ли это место для начала, но некоторое время назад я подписался на рассылку статей от Intel Software Network и нашел там много интересного, представленного в довольно простой форме. Вы можете найти несколько очень простых статей о фундаментальных концепциях параллельных вычислений, например вот. Здесь есть краткое погружение в openMP, который является одним из возможных подходов для начала распараллеливания самых медленных частей вашего приложения, не изменяя остальные. (Если в этих частях присутствует параллелизм, конечно). Также посмотрите Intel Guide for Developing Multithreaded Applications. Или просто полистайте раздел статей, статей не слишком много, так что вы сможете быстро понять, что вам больше подходит. У них также есть форум и еженедельная веб-трансляция под названием Parallel Programming Talk.

4
ответ дан 30 November 2019 в 22:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: