Барьер (информатика) - Barrier (computer science)
В параллельные вычисления, а барьер это тип синхронизация метод. Барьер для группы потоков или процессов в исходном коде означает, что любой поток / процесс должен остановиться в этой точке и не может продолжаться, пока все другие потоки / процессы не достигнут этого барьера.
Многие коллективные процедуры и параллельные языки на основе директив налагают неявные барьеры. Например, параллельный делать зациклиться Фортран с OpenMP не будет разрешено продолжить работу в любом потоке до завершения последней итерации. Это в случае, если программа полагается на результат цикла сразу после его завершения. В передача сообщений, любая глобальная коммуникация (например, сокращение или разброс) может означать препятствие.
Выполнение
Базовый барьер имеет в основном две переменные, одна из которых записывает состояние прохода / остановки барьера, а другая сохраняет общее количество потоков, которые вошли в барьер. Состояние барьера было инициализировано как "стоп" первыми потоками, входящими в барьер. Всякий раз, когда поток входит, в зависимости от количества потоков, уже находящихся в барьере, только если он последний, поток устанавливает состояние барьера как «проход», чтобы все потоки могли выйти из барьера. С другой стороны, когда входящий поток не является последним, он оказывается в ловушке барьера и продолжает тестирование, изменилось ли состояние барьера с "стоп" на "пройти", и выходит только тогда, когда состояние барьера меняется на "проходить". Следующий код C ++ демонстрирует эту процедуру.[1][2]
1 структура барьер_тип 2 { 3 // сколько процессоров вошло в барьер 4 // инициализируем 0 5 int прибыть_counter; 6 // сколько процессоров вышло за барьер 7 // инициализируем p 8 int leave_counter; 9 int флаг;10 стандартное::мьютекс замок;11 };12 13 // барьер для процессоров p14 пустота барьер(барьер_тип* б, int п)15 {16 б->замок.замок();17 если (б->leave_counter == п)18 {19 если (б->прибыть_counter == 0) // в барьере нет других потоков20 {21 б->флаг = 0; // первый прибывший очищает флаг22 }23 еще24 {25 б->замок.разблокировать();26 пока (б->leave_counter != п); // ждем, пока все уйдут перед очисткой27 б->замок.замок();28 б->флаг = 0; // первый прибывший очищает флаг29 }30 }31 б->прибыть_counter++;32 int прибывший = б->прибыть_counter;33 б->замок.разблокировать();34 если (прибывший == п) // последний прибывший устанавливает флаг35 {36 б->прибыть_counter = 0;37 б->leave_counter = 1;38 б->флаг = 1;39 }40 еще41 {42 пока (б->флаг == 0); // ждем флага43 б->замок.замок();44 б->leave_counter++;45 б->замок.разблокировать();46 }47 }
Возможные проблемы следующие:
- Когда реализованы последовательные барьеры с использованием одной и той же переменной состояния прохода / блока, тупик может произойти в первом барьере всякий раз, когда поток достигает второго, и некоторые потоки еще не вышли из первого барьера.
- Из-за того, что все потоки постоянно обращаются к глобальной переменной для прохода / остановки, коммуникационный трафик довольно высок, что снижает масштабируемость.
Следующий централизованный барьер реверсирования чувств разработан для решения первой проблемы. А вторая проблема может быть решена путем перегруппировки потоков и использования многоуровневого барьера, например Комбинированный барьер из дерева. Также аппаратные реализации могут иметь преимущество более высокой масштабируемость.
Централизованный барьер реверсирования чувств
Централизованный барьер Sense-Reversal решает потенциальную проблему тупика, возникающую при использовании последовательных барьеров. Вместо того, чтобы использовать одно и то же значение для представления прохождения / остановки, последовательные барьеры используют противоположные значения для состояния прохождения / остановки. Например, если барьер 1 использует 0 для остановки потоков, барьер 2 будет использовать 1 для остановки потоков, а барьер 3 будет использовать 0, чтобы снова остановить потоки и так далее.[3] Следующий код C ++ демонстрирует это.[1][4][2]
1 структура барьер_тип 2 { 3 int прилавок; // инициализируем 0 4 int флаг; // инициализируем 0 5 стандартное::мьютекс замок; 6 }; 7 8 int local_sense = 0; // частный на процессор 9 10 // барьер для процессоров p11 пустота барьер(барьер_тип* б, int п)12 {13 local_sense = 1 - local_sense;14 б->замок.замок();15 б->прилавок++;16 int прибывший = б->прилавок;17 если (прибывший == п) // последний прибывший устанавливает флаг18 {19 б->замок.разблокировать();20 б->прилавок = 0;21 // ограждение памяти, чтобы гарантировать, что изменение будет встречаться22 // виден до изменения флага23 б->флаг = local_sense;24 }25 еще26 {27 б->замок.разблокировать();28 пока (б->флаг != local_sense); // ждем флага29 }30 }
Комбинирование барьера из дерева
Комбинированный древовидный барьер - это иерархический способ реализации барьера для устранения масштабируемость избегая случая, когда все нити вращаются в одном месте.[3]
В k-Tree Barrier все потоки поровну разделены на подгруппы по k потоков, и в этих подгруппах выполняется синхронизация первого раунда. После того как все подгруппы завершили синхронизацию, первый поток в каждой подгруппе переходит на второй уровень для дальнейшей синхронизации. На втором уровне, как и на первом уровне, потоки формируют новые подгруппы из k потоков и синхронизируются внутри групп, отправляя по одному потоку в каждой подгруппе на следующий уровень и так далее. В конце концов, на последнем уровне нужно синхронизировать только одну подгруппу. После синхронизации последнего уровня сигнал освобождения передается на верхние уровни, и все потоки проходят через барьер.[4][5]
Реализация аппаратного барьера
Аппаратный барьер использует оборудование для реализации указанной выше базовой модели барьера.[1]
В простейшей аппаратной реализации используются выделенные провода для передачи сигнала для создания барьера. Этот выделенный провод выполняет операцию ИЛИ / И, выступая в качестве флагов прохода / блокировки и счетчика потоков. Для небольших систем такая модель работает, и скорость передачи данных не имеет большого значения. В больших многопроцессорных системах такая конструкция оборудования может сделать реализацию барьера с высокой задержкой. Сетевое соединение между процессорами - это одна из реализаций для снижения задержки, которая аналогична объединению барьера дерева.[6]
Смотрите также
Рекомендации
- ^ а б c Солихин, Ян (01.01.2015). Основы параллельной многоядерной архитектуры (1-е изд.). Чепмен и Холл / CRC. ISBN 978-1482211184.
- ^ а б «Внедрение барьеров». Университет Карнеги Меллон.
- ^ а б Каллер, Дэвид (1998). Параллельная компьютерная архитектура, аппаратно-программный подход. ISBN 978-1558603431.
- ^ а б Нанджеговда, Рамачандра; Эрнандес, Оскар; Чепмен, Барбара; Цзинь, Хаоцян Х. (03.06.2009). Мюллер, Маттиас С .; Supinski, Bronis R. de; Чапмен, Барбара М. (ред.). Развитие OpenMP в эпоху крайнего параллелизма. Конспект лекций по информатике. Springer Berlin Heidelberg. стр.42 –52. Дои:10.1007/978-3-642-02303-3_4. ISBN 9783642022845.
- ^ Nikolopoulos, Dimitrios S .; Папатеодору, Теодор С. (1999-01-01). Количественная архитектурная оценка алгоритмов и дисциплин синхронизации в системах ccNUMA: пример SGI Origin2000. Материалы 13-й Международной конференции по суперкомпьютерам.. ICS '99. Нью-Йорк, Нью-Йорк, США: ACM. С. 319–328. Дои:10.1145/305138.305209. ISBN 978-1581131642.
- ^ N.R. Адига и др. Обзор суперкомпьютера BlueGene / L. Труды конференции по высокопроизводительным сетям и вычислениям, 2002.
- ^ «Параллельное программирование с барьерной синхронизацией». Март 2012 г.