Атомарные операции. Современный тренд

14 Ноя 2012

Атомарные операции. Современный тренд

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

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

Продолжение.
Начало — в статье «Атомарные операции. История вопроса».

Семафоры параллельных процессов

В архитектуре x86 появились инструкции CMPXCHG и CMPXCHG8B, которые выполняют сравнение операнда в памяти с заданным значением и обмен содержимым между указанным операндом и регистрами процессора, управляемый результатами данного сравнения. В архитектуре x86-64 добавлена инструкция CMPXCHG16B, выполняющая ту же операцию для 128-битного операнда. Рассмотрим ее подробнее.

  1. Сравнивается содержимое регистровой пары RDX:RAX и ячейка памяти.
  2. Если равно, устанавливается флаг ZF и содержимое регистровой пары RCX:RBX записывается в указанную ячейку.
  3. Если не равно, сбрасывается флаг ZF и содержимое ячейки памяти загружается в регистровую пару RDX:RAX.

В процессорах семейства IA-64 (Intel Itanium), есть инструкция FETCHADD. Она выполняет чтение операнда из  памяти, его сохранение в регистре,  прибавление к нему константы и запись суммы в ту же ячейку. Сумма генерируется по определенным правилам. Инструкция используется для работы с ячейками-семафорами. Принципиально то, что ее выполнение может быть экспортировано за пределы процессора. При этом  процессор передает системной логике соответствующий запрос и операнд. А последовательность чтение-сложение-запись, формирует контроллер памяти. Отметим, что в современных системах, где ряд узлов системной логики интегрированы в процессор, такое экспортирование операции не всегда означает ее физическое вынесение за пределы корпуса или кристалла процессора.

Атомарные операции и шина PCI

Атомарные операции и шина PCI

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

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

Как известно, кроме центрального процессора к оперативной памяти могут иметь доступ bus-master устройства, подключенные к PCI-шине. И если до последнего времени ни спецификация Legacy PCI, ни основополагающие для шины PCI Express документы,  не оговаривали аппаратную поддержку атомарных операций (если не принимать во внимание сигнал блокировки LOCK#), то с появлением спецификации PCI Express, Rev. 2.1, для них резервируются специальные типы транзакций.

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

В случае, когда атомарные операции выполняются средствами шины PCI Express, как это описано в новой спецификации, ряд операций (в том числе, даже арифметические операции сложения и сравнения) экспортируются за пределы ядра процессора. Их выполнение возлагается на контроллер шины или контроллер памяти. Очевидно, что размещать сложное арифметико-логическое устройство (АЛУ) вне процессора не эффективно. Именно с необходимостью упростить такое «распределенное» АЛУ связаны ограничения на разрядность операндов и требования выравнивания, описанные в спецификации PCI Express и сопутствующих документах.

Аппаратная поддержка средствами интерфейса PCI Express вводится для следующих операций:

  1. Unconditional Swap (безусловный обмен, аналог ассемблерной инструкции XCHG), требует одного чтения и одной записи.
  2. Compare and Swap (сравнение и обмен, аналог инструкции CMPXCHG), требует чтения, сравнения и записи.
  3. Fetch and Add (выборка и сложение, аналог инструкции FETCHADD), требует чтения, сложения и записи.

Анализируя топологию современных систем, можно видеть, что ситуация, при которой между инициатором транзакции и системным ОЗУ находится линк PCI Express, более типична для работы bus-master устройств, чем для центрального процессора. Поэтому данная функциональность контроллера PCIe может быть востребована периферийными устройствами, содержащими автономный процессор, например, видео адаптером или дисковым контроллером, оборудованным процессором ввода-вывода.

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