Arhn - архитектура программирования

Как атомарные операции реализуются на аппаратном уровне?

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

Насколько я понимаю, выполнение инструкции должно

  1. Получить значение из памяти
  2. Сравните значение
  3. В зависимости от сравнения, возможно, сохраните другое значение в памяти

Что мешает другому ядру получить доступ к адресу памяти после того, как первое извлекло его, но до того, как оно установит новое значение? Контроллер памяти этим управляет?

edit: если реализация x86 является секретной, я был бы рад услышать, как ее реализует какое-либо семейство процессоров.


  • Краткий ответ: дополнительные транзисторы в чипе для реализации специальных протоколов когерентности кэш-памяти и памяти, а также протоколов синхронизации шины. Длинный ответ слишком длинный. 07.02.2013
  • Производитель процессора давно перестал предоставлять запрашиваемую вами информацию. Они просто описывают, как это сделать, а не как это реализовано. Вы можете получить некоторое представление о руководствах по процессорам Intel, том 3a, глава 8.1. 07.02.2013
  • @NikBougalis Похоже, это именно то, что меня интересует. Где мне найти более длинный ответ? Спасибо! 07.02.2013
  • @HansPassant дал вам хорошую отправную точку. Более подробную информацию, вероятно, будет очень трудно получить. 07.02.2013
  • @HansPassant Я посмотрю на это, спасибо! Меня не обязательно интересуют современные реализации. 07.02.2013

Ответы:


1

Вот статья на сайте software.intel.com, посвященном блокировкам на уровне пользователя:

Блокировки на уровне пользователя включают использование атомарных инструкций процессора для атомарного обновления пространства памяти. Атомарные инструкции включают использование префикса блокировки в инструкции и назначение операнда назначения адресу памяти. Следующие инструкции могут выполняться атомарно с префиксом блокировки на современных процессорах Intel: ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG, CMPXCH8B, DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD и ХЧГ. [...] В большинстве инструкций префикс блокировки должен использоваться явно, за исключением инструкции xchg, где префикс блокировки подразумевается, если инструкция включает адрес памяти.

Во времена процессоров Intel 486 префикс блокировки использовался для подтверждения блокировки шины, что приводило к значительному снижению производительности. Начиная с архитектуры Intel Pentium Pro блокировка шины преобразуется в блокировку кэша. Блокировка по-прежнему будет установлена ​​на шине в самых современных архитектурах, если блокировка находится в некэшируемой памяти или если блокировка распространяется за границу строки кэша, разделяющую строки кэша. Оба эти сценария маловероятны, поэтому большинство префиксов блокировки будут преобразованы в кэш-блокировку, которая намного дешевле.

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

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

07.02.2013

2

Примером реализации этого является LL/SC, где процессор фактически будет иметь дополнительные инструкции, которые используются для выполнения атомарных операций. Со стороны памяти это когерентность кеша. Одним из самых популярных протоколов когерентности кэша является протокол MESI. .

07.02.2013

3

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

  1. Загрузить значение из кеша в регистр
  2. Увеличить значение, загруженное в регистр
  3. Сохраните обновленное значение обратно в кеш

Таким образом, чтобы реализовать 3 приведенные выше инструкции атомарным образом, мы должны сначала получить эксклюзивный доступ к кэш-линии, которая содержит требуемое значение. Как только мы получим эксклюзивный доступ, мы не должны отказываться от эксклюзивного доступа к этой кэш-линии, пока операция «сохранения» не будет завершена. Это означает, что процессор, выполняющий атомарные инструкции, не должен тем временем отвечать на какие-либо сообщения протокола когерентности кэша для этой строки кэша. Хотя дьявол кроется в деталях того, как это реализовано, по крайней мере, это дает нам ментальную модель.

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

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

07.05.2017

4

Контроллер памяти отвечает только за то, чтобы память и кеш на разных процессорах оставались согласованными — если вы записываете в память на CPU1, CPU2 не сможет прочитать что-то еще из своего кеша. В его обязанности не входит следить за тем, чтобы они оба пытались манипулировать одними и теми же данными. Есть несколько низкоуровневых инструкций, использующих блокировку и атомарные операции. Они используются на уровне ОС для манипулирования небольшими фрагментами памяти для создания таких вещей, как мьютексы и семафоры, это буквально один или два байта памяти, над которыми должны выполняться атомарные синхронизированные операции. Затем на основе этого строятся приложения для выполнения операций с более крупными структурами данных и ресурсами.

07.02.2013
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..