Как получить 0 тактов при измерении задержки с помощью инструкции rdtscp? - PullRequest
0 голосов
/ 19 октября 2018

Я хотел измерить задержку очень маленького куска кода.Поэтому я добавил код, чтобы иметь инструкцию 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 обновляется каждый такт.Таким образом, значения, которые читают две инструкции, не должны быть одинаковыми!

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

...