Я работаю над высокопроизводительной библиотекой, в которой мне нужно остановить момент времени потока, когда он завершил вычисление, а затем сохранить этот момент времени в глобальной переменной, чтобы эта глобальная переменная всегда содержала самое последнее окончание время нити.
Сейчас я использую библиотеку C ++ std: chrono с метками времени, чтобы остановить время, например:
auto start = std::chrono::high_resolution_clock::now().time_since_epoch();
// thread calculates something
auto finish = std::chrono::high_resolution_clock::now().time_since_epoch();
unsigned time = std::chrono::duration_cast<std::chrono::microseconds>(finish-start).count();
// now I can use the needed time and also update a global variable with the finish time point.
Это работает довольно хорошо. Но ...
Вызов chrono медленнее, чем вызов rdtsc ().
Версия rdtsc:
static __inline__ ticks getticks(void)
{
unsigned a, d;
asm("cpuid");
asm volatile("rdtsc" : "=a" (a), "=d" (d));
return (((ticks)a) | (((ticks)d) << 32));
}
tick = getticks();
sleep(1); // or whatever calculation
tick1 = getticks();
time = (unsigned)((tick1-tick)/2400000/*The CPU speed*/);
Сравнение:
Я измерил оба, chrono и rdtsc, вызовы с самим rdtsc, чтобы увидеть, сколько тиков им нужно, и результаты:
- хроно понадобилось около 34096 тиков
- рдцц потребовалось около 1744 тиков
Проблема:
Я не могу использовать rdtsc, потому что он, насколько я знаю, только относительно. Я не могу использовать его для измерения временных точек, верно? Мне нужны не только длительности некоторых вычислений, но и фактический момент окончания, чтобы каждый поток знал, когда произошло самое последнее время окончания.
Вопрос : Какой самый быстрый способ измерения глобальных временных точек и распределения между всеми потоками?