Барьер (информатика) - 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 }

Возможные проблемы следующие:

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

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

Централизованный барьер реверсирования чувств

Централизованный барьер 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]

Смотрите также

Рекомендации

  1. ^ а б c Солихин, Ян (01.01.2015). Основы параллельной многоядерной архитектуры (1-е изд.). Чепмен и Холл / CRC. ISBN  978-1482211184.
  2. ^ а б «Внедрение барьеров». Университет Карнеги Меллон.
  3. ^ а б Каллер, Дэвид (1998). Параллельная компьютерная архитектура, аппаратно-программный подход. ISBN  978-1558603431.
  4. ^ а б Нанджеговда, Рамачандра; Эрнандес, Оскар; Чепмен, Барбара; Цзинь, Хаоцян Х. (03.06.2009). Мюллер, Маттиас С .; Supinski, Bronis R. de; Чапмен, Барбара М. (ред.). Развитие OpenMP в эпоху крайнего параллелизма. Конспект лекций по информатике. Springer Berlin Heidelberg. стр.42 –52. Дои:10.1007/978-3-642-02303-3_4. ISBN  9783642022845.
  5. ^ Nikolopoulos, Dimitrios S .; Папатеодору, Теодор С. (1999-01-01). Количественная архитектурная оценка алгоритмов и дисциплин синхронизации в системах ccNUMA: пример SGI Origin2000. Материалы 13-й Международной конференции по суперкомпьютерам.. ICS '99. Нью-Йорк, Нью-Йорк, США: ACM. С. 319–328. Дои:10.1145/305138.305209. ISBN  978-1581131642.
  6. ^ N.R. Адига и др. Обзор суперкомпьютера BlueGene / L. Труды конференции по высокопроизводительным сетям и вычислениям, 2002.

[1]