я чиню диспетчер задач в ЯОС. В ЯОС есть процедура для замера времени выполнения треда. В юникс-версии она была сломана и вызывала, по сути, rdtsc,
проц -ДайКвоТактовПроцессораСМоментаПерезапуска* (): цел64;
машКод
XOR RAX, RAX
RDTSC ; set EDX:EAX
SHL RDX, 32
OR RAX, RDX
кон ДайКвоТактовПроцессораСМоментаПерезапуска;
Поэтому в местном диспетчере задач у всех тредов было одинаковое CPU. Я поправил процедуру, которая лежит в основе замера, и теперь она выглядит так:
проц GetCpuCycles*( process : Process; перем cpuCycles: CpuCyclesArray; all: булево );
перем temp : цел64;
перем t: Unix.Timespec;
перем кодЧасов: Unix.ClockId_t;
перем успехТочногоЗамера: булево;
нач
утв(process # НУЛЬ);
если Unix.pthread_getcpuclockid(process.threadId, адресВПамяти из кодЧасов) = 0 то
если Unix.clock_gettime(кодЧасов, адресВПамяти из t) = 0 то
(* Вот здесь что надо сделать??? *)
cpuCycles[0] := цел64(t.tv_sec)*1000000000 + цел64(t.tv_nsec);
успехТочногоЗамера := истина всё всё;
если ~успехТочногоЗамера то
cpuCycles[0] := ЭВМ.ДайКвоТактовПроцессораСМоментаПерезапуска() всё;
если ~all то
temp := process.lastThreadTimes;
process.lastThreadTimes := cpuCycles[0];
cpuCycles[0] := cpuCycles[0] - temp;
всё;
кон GetCpuCycles;
Т.е. я пытаюсь воспользоваться clock_gettime, и если у меня всё получается, то считаю, что 1 цикл = 1 наносекунда. Если не получается, то использую старое решение. В результате всё вызвалось нормально и я увидел, какие треды работают, а какие спят. Но единицы измерения вряд ли правильные. Как пересчитать, чтобы было похоже на те циклы, которые считает rdtsc?
Иными словами, как узнать частоту, с которой тикают часы, показания которых возвращает rdtsc?