Я хотел измерить задержку очень маленького куска кода.Поэтому я добавил код, чтобы иметь инструкцию rdtscp до и после нее.Проблема заключается в том, что измеряемая мной задержка равна 0.
static inline __attribute__((always_inline)) uint64_t rdtscp()
{
uint64_t cycles_high, cycles_low;
asm volatile
("rdtscp\n\t"
"mov %%rdx, %0\n\t"
"mov %%rax, %1\n\t"
: "=r" (cycles_high), "=r" (cycles_low) :: "%rax", "%rbx", "%rcx", "%rdx");
return (cycles_high << 32) + cycles_low;
}
Процесс закреплен на одном конкретном ядре, поэтому несинхронизированные регистры tsc для разных процессоров не могут быть проблемой.Я знаю, что я не использовал команду сериализации, такую как cpuid, поэтому инструкции rdtscp можно было переставить в неисправном процессоре.Тем не менее, это должны быть две разные инструкции.И, насколько я знаю, регистр tsc обновляется каждый такт.Таким образом, значения, которые читают две инструкции, не должны быть одинаковыми!
Единственная возможная причина, по которой я могу придумать для этого, состоит в том, что многопоточный процессор выдает обе инструкции в одно и то же время.Это правильно?