Что такое multiprocessor free
Зачем, когда и как использовать multithreading и multiprocessing в Python
Салют, хабровчане. Прямо сейчас в OTUS открыт набор на курс «Machine Learning», в связи с этим мы перевели для вас одну очень интересную «сказочку». Поехали.
Давным-давно, в далекой-далекой галактике…
Жил в маленькой деревушке посреди пустыни мудрый и могущественный волшебник. И звали его Дамблдальф. Он был не просто мудр и могущественен, но и помогал людям, которые приезжали из далеких земель, чтобы просить помощи у волшебника. Наша история началась, когда один путник принес волшебнику магический свиток. Путник не знал, что было в свитке, он лишь знал, что если кто-то и сможет раскрыть все тайны свитка, то это именно Дамблдальф.
Глава 1: Однопоточность, однопроцессность
Если вы еще не догадались, я проводил аналогию с процессором и его функциями. Наш волшебник – это процессор, а свиток – это список ссылок, которые ведут к силе Python и знанию, чтобы овладеть ею.
Первой мыслью волшебника, который без особого труда расшифровал список, было послать своего верного друга (Гарригорна? Знаю, знаю, что звучит ужасно) в каждое из мест, которые были описаны в свитке, чтобы найти и принести то, что он сможет там отыскать.
Как видите, мы просто перебираем URL-адреса один за другим с помощью цикла for и читаем ответ. Благодаря %%time и магии IPython, мы можем увидеть, что с моим печальным интернетом это заняло около 12 секунд.
Глава 2: Multithreading
Неспроста волшебник славился своей мудростью, он быстро смог придумать куда более эффективный способ. Вместо того, чтобы посылать одного человека в каждое место по порядку, почему бы не собрать отряд надежных соратников и не отправить их в разные концы света одновременно! Волшебник сможет разом объединить все знания, которые они принесут!
Все верно, вместо просмотра списка в цикле последовательно, мы можем использовать multithreading (многопоточность) для доступа к нескольким URL-адресам одновременно.
Гораздо лучше! Почти как… магия. Использование нескольких потоков может значительно ускорить выполнение многих задач, связанных с вводом-выводом. В моем случае большая часть времени, затраченного на чтение URL-адресов, связана с задержками сети. Программы, привязанные к вводу-выводу, проводят большую часть времени жизни в ожидании, как вы уже догадались, ввода или вывода (подобно тому, как волшебник ждет, пока его друзья съездят в места из свитка и вернутся обратно). Это может быть ввод-вывод из сети, базы данных, файла или от пользователя. Такой ввод-вывод как правило занимает много времени, поскольку источнику может потребоваться выполнить предварительную обработку перед передачей данных на ввод-вывод. Например, процессор, будет считать гораздо быстрее, чем сетевое соединение будет передавать данные (по скорости примерно, как Флэш против вашей бабушки).
Примечание: multithreading может быть очень полезна в таких задачах, как очистка веб-страниц.
Глава 3: Multiprocessing
Шли годы, слава о добром волшебнике росла, а вместе с ней росла и зависть одного нелицеприятного темного волшебника (Саруморта? Или может Воландемана?). Вооруженной немеряной хитростью и движимый завистью, темный волшебник наложил на Дамблдальфа страшное проклятие. Когда проклятие настигло его, Дамблдальф понял, что у него есть всего несколько мгновений, чтобы отразить его. В отчаянии он рылся в своих книгах заклинаний и быстро нашел одно контрзаклятие, которое должно было сработать. Единственная проблема заключалась в том, что волшебнику нужно было вычислить сумму всех простых чисел меньше 1 000 000. Странное, конечно, заклятье, но что имеем.
Волшебник знал, что вычисление значения будет тривиальным, если у него будет достаточно времени, но такой роскоши у него не было. Несмотря на то, что он великий волшебник, все же и он ограничен своей человечностью и может проверять на простоту всего одно число за раз. Если бы он решил просто просуммировать простые числа друг за другом, времени ушло бы слишком много. Когда до того, чтобы применить контрзаклятье остались считанные секунды, он вдруг вспомнил заклятье multiprocessing, которое узнал из магического свитка много лет назад. Это заклинание позволит ему копировать себя, чтобы распределить числа между своими копиями и проверять несколько одновременно. И в итоге все, что ему нужно будет сделать – это просто сложить числа, которые он и его копии обнаружат.
У современных процессоров больше одного ядра, поэтому мы можем ускорить выполнение задач, используя модуль многопроцессной обработки multiprocessing. Задачи, завязанные на процессоре – это программы, которые большую часть времени своей работы выполняют вычисления на процессоре (тривиальные математические вычисления, обработку изображений и т.д.). Если вычисления могут выполняться независимо друг от друга, мы имеем возможность разделить их между доступными ядрами процессора, тем самым получив значительный прирост в скорости обработки.
Все, что вам нужно сделать, это:
Подобно тому, как волшебник ограничен своей человеческой природой и может вычислять всего одно число в единицу времени, Python поставляется с такой вещью, которая называется Global Interpreter Lock (GIL). Python с радостью позволит вам породить столько потоков, сколько вы захотите, но GIL гарантирует, что только один из этих потоков будет выполняться в любой момент времени.
Для задачи, связанной с вводом-выводом, такая ситуация совершенно нормальна. Один поток отправляет запрос на один URL-адрес и ждет ответа, только потом этот поток может быть заменен другим, который отправит другой запрос на другой URL-адрес. Поскольку поток не должен ничего делать, пока он не получит ответа, нет никакой разницы, что в данный момент времени выполняется всего один поток.
Для задач, выполняемых на процессоре, наличие нескольких потоков почти также бесполезно, как соски на доспехах. Поскольку в единицу времени может выполняться только один поток, даже если вы порождаете несколько, каждому из которых будет выделено число для проверки на простоту, процессор все равно будет работать только с одном потоком. По сути, эти числа все равно будут проверяться одно за другим. А издержки работы с несколькими потоками будут способствовать снижению производительности, которые вы как раз можете наблюдать при использовании multithreading в задачах, выполняемых на процессоре.
Если вы породите больше процессов, чем ваш процессор может обработать в единицу времени, то заметите, что производительность начнет падать. Так происходит, потому что операционная система должна делать больше работы, тасуя процессы между ядрами процессора, потому что процессов больше. В реальности все может быть еще сложнее, чем я рассказал сегодня, но основную идею я донес. Например, в моей системе производительность упадет, когда количество процессов будет равно 16. Все потому, что в моем процессоре всего 16 логических ядер.
Глава 4: Заключение
В чем разница между MultiCore и MultiProcessor? [Дубликат]
В чем разница между MultiCore и MultiProcessor, пожалуйста?
Многопроцессорная система содержит более одного такого процессора, что позволяет им работать параллельно. Это называется SMP или Symmetric MultiProcessing.
Мульти Ядро процессора имеет несколько вычислительных ядра на одном процессоре. Теперь, это может означать разные вещи в зависимости от конкретной архитектуры, но в основном это означает, что определенное подмножество компонентов ЦП дублируется, так что несколько «ядер» могут работать параллельно в отдельных операциях. Это называется CMP, многопроцессорная обработка на уровне чипа.
Например, многоядерный процессор может иметь отдельный кэш L1 и модуль выполнения для каждого ядра, тогда как он имеет общий кэш L2 для всего процессора. Это означает, что, хотя процессор имеет один большой пул более медленной кэш-памяти, он имеет отдельные модули быстрой памяти и арифметические / логические блоки для каждого из нескольких ядер. Это позволило бы каждому ядру выполнять операции одновременно с другими.
Таким образом, вы могли бы иметь многопроцессорную, многоядерную, многопоточную систему. Что-то вроде двухъядерных, многопоточных процессоров даст вам 2x4x2 = 16 логических процессоров с точки зрения операционной системы.
Разные рабочие нагрузки выигрывают от разных настроек. Однопоточная рабочая нагрузка, выполняемая в основном на одноцелевой машине, выигрывает от очень быстрой одноядерной системы / процессора. Рабочие нагрузки, которые получают преимущества от систем с высокой степенью параллелизации, таких как установки SMP / CMP / SMT, включают в себя те, которые имеют множество мелких деталей, с которыми можно работать одновременно, или системы, которые используются для множества вещей одновременно, например, настольный компьютер, используемый для просматривайте веб-страницы, играйте во флэш-игры и смотрите видео одновременно. В целом, в наши дни аппаратное обеспечение все больше склоняется к высокопараллельным архитектурам, так как большинство необработанных скоростей одного ЦП / ядра «достаточно быстрые» для обычных рабочих нагрузок большинства моделей.
Мультипроцессоры
Рис. 5. Архитектура многопроцессорных систем с общей (разделяемой) памятью: системы с однородным доступом к памяти
Основные преимущества SMP-систем:
Дело в том, что при наличии общих данных копии значений одних и тех же переменных могут оказаться в кэшах разных процессоров. Если в такой ситуации (при наличии копий общих данных) один из процессоров выполнит изменение значения разделяемой переменной, то значения копий в кэшах других процессоров окажутся не соответствующими действительности и их использование приведет к некорректности вычислений. Обеспечение однозначности кэшей обычно реализуется на аппаратном уровне – для этого после изменения значения общей переменной все копии этой переменной в кэшах отмечаются как недействительные и последующий доступ к переменной потребует обязательного обращения к основной памяти. Следует отметить, что необходимость обеспечения когерентности приводит к некоторому снижению скорости вычислений и затрудняет создание систем с достаточно большим количеством процессоров.
Наличие общих данных при параллельных вычислениях приводит к необходимости синхронизации взаимодействия одновременно выполняемых потоков команд. Так, например, если изменение общих данных требует для своего выполнения некоторой последовательности действий, то необходимо обеспечить взаимоисключение (mutual exclusion), чтобы эти изменения в любой момент времени мог выполнять только один командный поток. Задачи взаимоисключения и синхронизации относятся к числу классических проблем, и их рассмотрение при разработке параллельных программ является одним из основных вопросов параллельного программирования
Этот существенный недостаток SMP-систем не позволяет считать их по-настоящему перспективными. Причиной плохой масштабируемости является то, что в данный момент шина способна обрабатывать только одну транзакцию, вследствие чего возникают проблемы разрешения конфликтов при одновременном обращении нескольких процессоров к одним и тем же областям общей физической памяти. Вычислительные элементы начинают друг другу мешать. Когда произойдет такой конфликт, зависит от скорости связи и от количества вычислительных элементов. В настоящее время конфликты могут происходить при наличии 8-24 процессоров. Кроме того, системная шина имеет ограниченную (хоть и высокую) пропускную способность (ПС) и ограниченное число слотов. Все это очевидно препятствует увеличению производительности при увеличении числа процессоров и числа подключаемых пользователей. В реальных системах можно задействовать не более 32 процессоров.
Общий доступ к данным может быть обеспечен и при физически распределенной памяти (при этом, естественно, длительность доступа уже не будет одинаковой для всех элементов памяти) (см. рис. 6). Такой подход именуется неоднородным доступом к памяти (non-uniform memory access или NUMA).
Рис. 6. Архитектура многопроцессорных систем с общей (разделяемой) памятью: системы с неоднородным доступом к памяти
Среди систем с таким типом памяти выделяют:
— системы, в которых для представления данных используется только локальная кэш-память имеющихся процессоров (cache-only memory architecture или COMA); примерами являются KSR-1 и DDM;
— системы, в которых обеспечивается когерентность локальных кэшей разных процессоров (cache-coherent NUMA или CC-NUMA); среди таких систем: SGI Origin 2000, Sun HPC 10000, IBM/Sequent NUMA-Q 2000;
— системы, в которых обеспечивается общий доступ к локальной памяти разных процессоров без поддержки на аппаратном уровне когерентности кэша (non-cache coherent NUMA или NCC-NUMA); например, система Cray T3E.
Использование распределенной общей памяти (distributed shared memory или DSM) упрощает проблемы создания мультипроцессоров (известны примеры систем с несколькими тысячами процессоров), однако возникающие при этом проблемы эффективного использования распределенной памяти (время доступа к локальной и удаленной памяти может различаться на несколько порядков) приводят к существенному повышению сложности параллельного программирования.
Многопроцессорные системы классифицируются в зависимости от того, как обрабатывается доступ к памяти процессора, и от того, относятся ли системные процессоры к одному типу или различным.
СОДЕРЖАНИЕ
Типы многопроцессорных систем
Есть много типов многопроцессорных систем:
Слабосвязанная многопроцессорная система (с распределенной памятью)
Характеристики системы
Многопроцессорная система с плотной связью (с общей памятью)
Многопроцессорная система с общей памятью, тесно связанной с процессорами.
Есть два типа систем:
Система унифицированного доступа к памяти (UMA)
Гетерогенная многопроцессорная система
Симметричная многопроцессорная система
Системы, работающие под управлением одной ОС ( операционной системы ) с двумя или более однородными процессорами и с централизованной общей основной памятью.
Каждый процессор имеет собственную кэш-память, которая действует как мост между процессором и основной памятью. Функция кеша состоит в том, чтобы облегчить потребность в доступе к данным в основной памяти, тем самым уменьшая трафик системной шины.
Использование разделяемой памяти позволяет использовать единое время доступа к памяти (UMA).
система cc-NUMA
cc-NUMA также называется архитектурой «распределенной разделяемой памяти» (DSM).
Разница во времени доступа между локальной и удаленной памятью также может быть на порядок величины, в зависимости от типа используемой сети подключения (быстрее в сегментированной шине, кросс-панели и двухточечном соединении; медленнее в последовательном кольцевом соединении).
Примеры подключения
Чтобы преодолеть этот предел, обычно используется большой удаленный кеш (см. Удаленный кеш ). Благодаря этому решению система cc-NUMA становится очень близкой к большой системе SMP.
Сильносвязанная и слабосвязанная архитектура
Обе архитектуры имеют компромиссы, которые можно резюмировать следующим образом:
Многопроцессорная система с глобальным умножением данных
Промежуточный подход между двумя предыдущими архитектурами заключается в наличии общих ресурсов и локальных ресурсов, таких как локальная память (LM), в каждом процессоре.
Общие ресурсы доступны для всех процессоров через системную шину, в то время как локальные ресурсы доступны только для локального процессора. С этой точки зрения кэш-память можно рассматривать как локальную память.
Эта система (запатентованная Ф. Зулианом), используемая в системе на основе DPX / 2300 Unix (Bull Hn Information Systems Italia (бывшая Honeywell)), представляет собой сочетание сильно и слабосвязанных систем и использует все их достижения. две архитектуры.
Локальная память разделена на два сектора: глобальные данные (GD) и локальные данные (LD).
Каждый раз, когда глобальные данные изменяются в локальной памяти, аппаратная широковещательная запись отправляется на системную шину во все другие локальные запоминающие устройства для поддержания согласованности глобальных данных. Таким образом, глобальные данные могут быть прочитаны каждым процессором, обращающимся к его собственной локальной памяти, без участия системной шины. Доступ к системной шине требуется только тогда, когда глобальные данные изменяются в локальной памяти для обновления копии этих данных, хранящейся в других локальных запоминающих устройствах.
Обмен локальными данными в слабосвязанной системе может осуществляться посредством передачи сообщений.