Понимание моделей памяти - PullRequest
5 голосов
/ 04 января 2011

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

Цитировать 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 не кешируется, тогда загрузка А займет дольше, чем B. Вместо ожидания A, процессор может извлечь B из своего кэша, скрывая задержку B: таким образом, процессор может выполнить сложение, как только А имеется в наличии. Расслабляя сильных (последовательная) модель памяти выполнения (т. е. сначала нужно загрузить A, а затем Б), большая производительность возможно ---- но переупорядочение не может быть прозрачный для программного обеспечения. Рассмотрим фрагмент кода ниже, это часть код, который может быть использован для реализации семафор спин-блокировки [2].

У меня вопрос: как это возможно, что при использовании более слабой модели памяти процессор может получить доступ к новому Y и старому X. Разве он не записан в одну и ту же память (RAM) или он работает по-другому? Я предполагаю, что если один процесс изменяет переменную, а другой читает ее после этого, он читает последнее значение.

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

Спасибо

Ответы [ 2 ]

4 голосов
/ 04 января 2011

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

0 голосов
/ 04 января 2011

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

...