Инструкция cmpxchg16b для выполнения атомарных 128-битных обменов памяти не поддерживается на старых версиях процессора x64, но кажется, что она поддерживается новыми версиями процессора уже несколько лет. Насколько вероятно, что я столкнусь с 64-битной машиной со старым процессором, в котором отсутствует эта инструкция?
3 ответа
Вы смотрите на ранние 64-битные процессоры AMD, до Rev F (то есть когда они перешли на память DDR2). Я думаю, что есть некоторые ранние степпинги D Intel Noconas, которые не поддерживают его, но они встречаются реже.
Поддержки в ЦП на самом деле может быть недостаточно, поскольку некоторые пользователи Core 2 узнали об этом при запуске Windows 8.1, особенно те, которые имели материнскую плату Intel DP35DP. Я еще не уверен, что в материнской плате может помешать CMPXCHG16B работать. Вероятно, биты обнаружения функции могут быть отключены BIOS. Чтобы подвести итог тому, что говорится в блоге Юхонга Бао, об ошибках процессора в ранних чипах Core 2 (степпинга E0/R0 45-нм Core 2), из-за которых их характеристики были искажены через CPUID. Насколько я могу судить, можно было обойти это через обновление BIOS/ микрокода.
У меня нет данных о распространенности некоторых типов процессоров, поэтому я не могу напрямую ответить на ваш вопрос. Однако вы можете узнать, поддерживает ли CPU CMPXCHG16B
, проверив, является ли CPUID.01h.ECX.bit13
равен 1
(доступно) или 0
(недоступно).
Также обратите внимание, что в руководствах Intel предлагается, чтобы эта инструкция выполнялась атомарно, вам необходимо объединить ее с префиксом LOCK
.