Как использовать CPUID в качестве инструкции сериализации?

CPUID можно использовать в качестве инструкции сериализации, как описано здесь и здесь. Каков минимальный/простейший синтаксис ассемблера, чтобы использовать его таким образом на С++?

// Is that enough?
// What to do with registers and memory?
// Is volatile necessary?
asm volatile("CPUID":::);

person Vincent    schedule 29.01.2018    source источник
comment
Технически вы вообще не можете этого сделать, поскольку встроенная сборка — это специфичная для компилятора вещь, которой нет в стандартном C++. Хотя мы могли догадаться, какой компилятор вы, скорее всего, используете, всегда указывайте эту информацию, когда задаете вопросы о встроенном ассемблере. Также упоминание целевой ISA обычно является хорошей идеей, даже если в этом случае ее можно угадать.   -  person Some programmer dude    schedule 29.01.2018
comment
Используйте встроенную функцию вместо asm. cpuid перезаписывает регистры, по крайней мере вам нужно перечислить eax, ebx, ecx и edx как затирающие. Да, volatile нужно.   -  person Jester    schedule 29.01.2018
comment
#include <intrin.h> и используйте функцию __cpuid().   -  person Kelvin Sherlock    schedule 29.01.2018
comment
Для чего тебе это?   -  person Maxim Egorushkin    schedule 29.01.2018
comment
Если вам нужно сериализовать rdtsc, используйте lfence. Intel гарантирует его работу (по крайней мере, на процессорах Intel). См. stackoverflow.com/questions/38994549/. (Однако на AMD кажется, что вам нужно mfence вместо lfence< /a>, так что cpuid, по-видимому, более переносим)   -  person Peter Cordes    schedule 29.01.2018


Ответы (1)


Есть ли причина, по которой вы не используете операции забора? Если цель состоит в том, чтобы сериализовать часть кода, вы можете сделать что-то вроде

    asm __volatile__ (
" mfence \n"
" lfence \n"
);
Your code
asm __volatile__ (
" mfence \n"
" lfence \n"
);
person Darakian    schedule 29.01.2018
comment
В руководстве Intel сказано: MFENCE не сериализует поток инструкций. - person Jester; 29.01.2018
comment
Выполните операцию сериализации для всех инструкций загрузки из памяти и сохранения в память, которые были выполнены до этой инструкции. Гарантирует, что каждый доступ к памяти, который предшествует в программном порядке инструкции ограничения памяти, глобально виден перед любой инструкцией памяти, которая следует за ограждением в программном порядке. software.intel.com/sites/landingpage/IntrinsicsGuide/ - person Darakian; 29.01.2018
comment
Да, но это касается только операций с памятью. Непривилегированные инструкции по сериализации — CPUID, IRET и RSM. и Следующие инструкции — это инструкции по упорядочению памяти, а не инструкции по сериализации. Они истощают подсистему памяти данных. Они не сериализуют поток выполнения инструкций. Непривилегированные инструкции по упорядочению памяти -- SFENCE, LFENCE и MFENCE. - person Jester; 29.01.2018
comment
@Jester: lfence теперь (или будет) официально задокументировано как сериализация, после нескольких лет, когда это было деталью реализации, но все еще видно, что некоторые документы Intel рекомендуют или, по крайней мере, используют lfence; rdtsc. По крайней мере что-то хорошее вышло из Spectre... (хотя я не уверен на 100%, что он так же сильно сериализуется, как cpuid). Но в любом случае вы правы в том, что mfence не сериализуется в потоке инструкций, на бумаге или на практике. Использование lfence и mfence подряд не кажется полезным. - person Peter Cordes; 29.01.2018
comment
Исправление: lfence сериализует в потоке инструкций без очистки буфера хранения. Этого достаточно для lfence; rdtsc. Это не инструкция сериализации в полном техническом смысле, как cpuid или iret. И mfence сериализуется на AMD в соответствии с документацией, а на практике также на некоторых процессорах Intel, таких как Skylake, возможно, обновление микрокода для исправления опечатки укрепило его, чтобы он был намного сильнее, чем гарантирует руководство Intel: Являются ли загрузки и сохранения единственными инструкциями, которые переупорядочиваются? - person Peter Cordes; 30.01.2019
comment
А также: Сериализируется ли LFENCE на процессорах AMD? да, при активном смягчении Spectre будет установлен соответствующий MSR, поэтому LFENCE блокирует спекулятивное выполнение, как на Intel . - person Peter Cordes; 30.01.2019
comment
В любом случае, вы забыли "memory" clobbers, поэтому переупорядочивание кода во время компиляции в/из сериализованного блока все еще возможно. - person Peter Cordes; 30.01.2019