Недавно я читал о моделях памяти, и меня немного смутило, как это работает.
Процитировать http://cis.poly.edu/muller/CS623/weakmemory.htm а>
если процессор записывает новый X, а затем записывает новый Y, все остальные процессоры, которые впоследствии выполняют чтение Y, а затем чтение X, будут обращаться либо к новому Y и новому X, старому Y и новому X, либо старому X и старому Y: но ни один процессор не получит доступ к новому Y и старому X. Это предположение о строгом упорядочивании было когда-то разумным. Однако современные производители компьютеров рекомендуют программистам не полагаться на упорядочение памяти. Это связано с тем, что новые системы управления памятью пытаются изменить порядок доступа к памяти в целях оптимизации. Системы, которым разрешено переупорядочивать запросы к памяти, называются системами (моделями) со слабоупорядоченной памятью. Чтобы изучить, как можно использовать переупорядочение для повышения производительности, рассмотрим следующий код ассемблера [2].
Load reg1, A // register1 = contents of memory A
Load reg2, B // register2 = contents of memory B
ADD reg3, reg1, reg2 // register3 = register1 + register2
Store reg3, C // contents of memory C = contents of register3
Если мы предположим, что местоположение B в настоящее время находится в кэше, а местоположение A не кэшировано, тогда загрузка A займет больше времени, чем B. Вместо ожидания A ЦП может извлечь B из своего кеша, скрывая задержку B: таким образом, ЦП может выполнять добавление, как только A станет доступным. Ослабив сильную (последовательную) модель выполнения памяти (т.е. сначала должен загрузиться A, а затем B), можно добиться большей производительности, но переупорядочение может быть непрозрачным для программного обеспечения. Рассмотрим фрагмент кода ниже, он является частью кода, который можно использовать для реализации семафора спин-блокировки [2].
Мой вопрос: как это возможно, что с более слабой моделью памяти может случиться так, что процессор может получить доступ к новому Y и старому X. Разве он не записывается в ту же память (RAM) или работает по-другому? Я предполагаю, что если один процесс изменяет переменную, а другой читает ее после этого, он считывает последнее значение.
Еще я не уверен в том, какой компонент позволяет переупорядочивать доступ к памяти. Сейчас я предполагаю, что компилятору разрешено переупорядочивать инструкции. Но может ли ЦП их переупорядочить?
Спасибо