Я написал базовый код, чтобы узнать количество тактов, используемых nop. Мы знаем, что nop занимает один такт.
#include <stdio.h>
#include <string.h>
#include <stdint.h>
int main(void)
{
uint32_t low1, low2, high1, high2;
uint64_t timestamp1, timestamp2;
asm volatile ("rdtsc" : "=a"(low1), "=d"(high1));
asm("nop");
asm volatile ("rdtsc" : "=a"(low2), "=d"(high2));
timestamp1 = ((uint64_t)high1 << 32) | low1;
timestamp2 = ((uint64_t)high2 << 32) | low2;
printf("Diff:%lu\n", timestamp2 - timestamp1);
return 0;
}
Но выход не 1.
Иногда это 14 или 16.
Могу ли я узнать причину этого. я что-то пропустил
rdtsc
инструкции. - person 1201ProgramAlarm   schedule 12.01.2020constant_tsc
в/proc/cpuinfo
указывает на то, что вы измеряете время, а не циклы. Вы, вероятно, захотите отправить инструкцию сериализации, чтобы предотвратить выполнение не по порядку. Вы установили привязку процессора к одному ядру? - person LegendofPedro   schedule 12.01.2020nop
занимает один цикл? Некоторые процессоры могут удалять несколько команд из потока команд в каждом цикле, поэтому они никогда не отправляются и не требуют времени выполнения. - person Eric Postpischil   schedule 12.01.2020-O0
, чтобы отключить оптимизацию (и, возможно,-S
, чтобы проверить вывод сборки). - person LegendofPedro   schedule 12.01.2020-O0
просто поместит больше мусора в интервал времени, но все равно не заставит 2-й RDTSC ждать завершения более ранних инструкций. Или также остановите запуск первого RDTSC раньше времени. См. мой канонический ответ о RDTSC: Как получить количество циклов ЦП в x86_64 из C++? - person Peter Cordes   schedule 12.01.2020constant_tsc
? Конечно, не 486 или ранее, где NOP фактически стоил бы 1 цикл. - person Peter Cordes   schedule 12.01.2020nop
. - person LegendofPedro   schedule 12.01.2020"%number"
подстановок операндов, прежде чем передать результат (включая сгенерированный компилятором ассемблер) ассемблеру. С-O0
вы получите места в стеке дляlow1
иlow2
, а не простоmov
в другие регистры (или, может быть,shl
/lea
в другой регистр до 2-го rdtsc). При втором взгляде вы на самом деле не получите больше инструкций в (попытке) временной области от-O0
, потому что нечего разливать / перезагружать; нет входов для 2-го asm - person Peter Cordes   schedule 12.01.2020