Самый быстрый способ измерения глобального времени (настенные часы) в многопоточном приложении с C ++ - PullRequest
1 голос
/ 11 марта 2019

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

Сейчас я использую библиотеку 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, потому что он, насколько я знаю, только относительно. Я не могу использовать его для измерения временных точек, верно? Мне нужны не только длительности некоторых вычислений, но и фактический момент окончания, чтобы каждый поток знал, когда произошло самое последнее время окончания.

Вопрос : Какой самый быстрый способ измерения глобальных временных точек и распределения между всеми потоками?

1 Ответ

2 голосов
/ 11 марта 2019

Я не могу использовать rdtsc, потому что, насколько я знаю, только относительно.

Это относительно некоторого неопределенного момента времени, например, Время включения процессора.

Я не могу использовать его для измерения временных точек, верно?

Вы используете rdtsc для измерения длительностей в циклах ЦП. Вы также можете использовать значение в качестве момента времени с неопределенного времени. Вы также можете узнать время настенных часов того неопределенного времени.


Если вы используете gcc, __builtin_ia32_rdtsc создает лучшую сборку, чем версии с ручным кодированием .

...