У меня есть этот код
#include <iostream>
#include <sched.h>
unsigned long long rdtscp(unsigned int* aux)
{
// For IA32
unsigned long long x;
asm volatile("rdtscp" : "=c" (*aux), "=A" (x) ::);
return x;
}
int main()
{
unsigned int aux0, aux1 = -1, aux2;
aux0 = sched_getcpu();
unsigned long long x = rdtscp(&aux1);
aux2 = sched_getcpu();
std::cout << "aux0 = " << aux0 << ", aux1 = " << aux1 << ", aux2 = " << aux2 << ", x = " << x << std::endl;
return 0;
}
Он определяет функцию rdtscp, которая использует встроенную сборку для вызова инструкции сборки rdtscp. Значение TSC выглядит хорошо, но идентификатор ядра всегда равен нулю, даже если sched_getcpu () вернул правильный идентификатор ядра, и он не равен нулю. Выход выглядит как
# g++ test.cpp -o test ; ./test
aux0 = 2, aux1 = 0, aux2 = 2, x = 231368797247511
Как я могу использовать rdtscp для получения TSC и идентификатора ядра?
Возможно, rdtscp инструкция не поддерживается вашим оборудованием. Вы можете проверить это:
#include <cpuid.h>
#include <stdio.h>
main()
{
unsigned a, b, c, d;
if (__get_cpuid(0x80000001, &a, &b, &c, &d))
puts("unsupported instruction rdtscp" + (d&1<<27 ? 2 : 0));
else
puts("unsupported cpuid level");
}