2014-12-05 3 views
1

На x86 предположим, что у меня есть несогласованный элемент данных, который охватывает границу строки кэша, например, адреса 0x1fff через 0x2003, содержащие 32-битное значение 20-битного разряда 0x11223344. Если поток A на ядре A записывает 0x55667788 на этот адрес, а поток B на ядре B «одновременно» делает чтение одного и того же адреса, может ли этот поток B потенциально читать сочетание старого и нового значения?многоядерный x86 чтение или запись несогласованных данных

Другими словами, поскольку несогласованная запись A будет разбита процессором на однобайтную запись 0x88 на адрес 0x1fff и трехбайтную запись 0x556677 на адрес 0x2000, возможно ли, что чтение B может произойти в середине этой несогласованной записи и завершить чтение 0x11223388 (или, если запись разделена в обратном порядке, 0x55667711)? Очевидно, что желательно, чтобы прочитанное возвращало либо старое значение, либо новое, и мне все равно, какая, но не смесь.

В идеале я ищу не только ответ на вопрос, но и авторитетную цитату из конкретных подтверждающих утверждений в руководствах по архитектуре Intel или AMD.

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

ответ

0

Я задал вопрос, потому что моя попытка проверить его сама не привела к появлению каких-либо экземпляров, в которых произошло смешанное чтение. Однако это, как оказалось, связано с ошибкой в ​​моей тестовой программе, и как только я исправил это, это происходит все время на AMD FX-8350. С другой стороны, если несогласованные данные не пересекают границу строки кэша, проблема не возникает.

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

Мой тест Исходный код программы в C помощью Pthreads находится по адресу:

https://gist.github.com/brouhaha/62f2178d12ec04a81078

Смежные вопросы