Отрицательные измерения тактового цикла с обратной связью 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