Отрицательные измерения тактового цикла с обратной связью rdtsc?

Я пишу код C для измерения количества тактов, необходимых для получения семафора. Я использую rdtsc, и перед выполнением измерения на семафоре я вызываю rdtsc два раза подряд, чтобы измерить издержки. Я повторяю это много раз в цикле for, а затем я использую среднее значение в качестве издержек rdtsc.

Правильно ли, прежде всего, использовать среднее значение?

Тем не менее, большая проблема здесь заключается в том, что иногда я получаю отрицательные значения для служебных данных (не обязательно усредненных, но по крайней мере частичных внутри цикла for).

Это также влияет на последовательный расчет количества циклов процессора, необходимых дляsem_wait() операция, которая иногда также оказывается отрицательной. Если то, что я написал, не понятно, здесьЯвляется частью кода, над которым я работаю.

Почему я получаю такие отрицательные значения?

(редактор'примечание: см.Получить количество тактов процессора? для правильного и портативного способа получения полной 64-битной метки времени."=A" Ограничение asm будет получать только младшие или старшие 32 бита при компиляции для x86-64, в зависимости от того, происходит ли при распределении регистров выбор RAX или RDX дляuint64_t выход. Это победилот забратьedx:eax.)

(редактор'с 2 примечание: ой, это 'это ответ на вопрос, почему мыполучаю отрицательные результаты. Еще стоит оставить здесь заметку в качестве предупреждения, чтобы не копировать этоrdtsc реализация.)

#include 
#include 
#include 
#include 
#include 

static inline uint64_t get_cycles()
{
  uint64_t t;
           // editor's note: "=A" is unsafe for this in x86-64
  __asm volatile ("rdtsc" : "=A"(t));
  return t;
}

int num_measures = 10;

int main ()
{
   int i, value, res1, res2;
   uint64_t c1, c2;
   int tsccost, tot, a;

   tot=0;    

   for(i=0; i

Ответы на вопрос(9)

Ваш ответ на вопрос