Понимание моделей памяти

Недавно я читал о моделях памяти, и меня немного смутило, как это работает.

Процитировать 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) или работает по-другому? Я предполагаю, что если один процесс изменяет переменную, а другой читает ее после этого, он считывает последнее значение.

Еще я не уверен в том, какой компонент позволяет переупорядочивать доступ к памяти. Сейчас я предполагаю, что компилятору разрешено переупорядочивать инструкции. Но может ли ЦП их переупорядочить?

Спасибо


person TomHastjarjanto    schedule 04.01.2011    source источник


Ответы (2)


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

person phkahler    schedule 04.01.2011

И компилятор, и ЦП могут переупорядочивать инструкции. См. порядок памяти.

person srparish    schedule 04.01.2011