2013-08-19 4 views
1

Я написал очень простую программу C, пытаясь понять rdtsc в C (Linux). Программа приведена ниже.rdtsc() дает странные результаты

#include <stdio.h> 

static inline unsigned long long tick() 
{ 
     unsigned long long d; 
     __asm__ __volatile__ ("rdtsc" : "=A" (d)); 
     return d; 
} 

int main() 
{ 
     long long res; 
     int a = 1; 
     int b = 3; 
     int c = 0; 
     res=tick(); 
     c = (a + b)*11000; 
     res=tick()-res; 
     printf("%lld\n",res); 
     return 0; 
} 

Конфигурация моего процессора такова, как показано ниже.

Architecture:   x86_64 
CPU op-mode(s):  32-bit, 64-bit 
Byte Order:   Little Endian 
CPU(s):    8 
On-line CPU(s) list: 0-7 
Thread(s) per core: 2 
Core(s) per socket: 4 
Socket(s):    1 
NUMA node(s):   1 
Vendor ID:    GenuineIntel 
CPU family:   6 
Model:     30 
Stepping:    5 
CPU MHz:    1197.000 
BogoMIPS:    5862.24 
Virtualization:  VT-x 
L1d cache:    32K 
L1i cache:    32K 
L2 cache:    256K 
L3 cache:    8192K 
NUMA node0 CPU(s):  0-7 

С выходом он выглядит как процессор 1.2GHz, который в моем понимании означает, что будет 1200 х 10^6 тиков в секунду.

Вывод вышеуказанной программы составляет 88, когда я запускаю ее на своей машине. Что удивительно, даже если я удалю 'c = (a + b) * 11000; между двумя тиками по-прежнему выход 88.

1) Почему выход не увеличивается. (он должен показать немного выше на основе циклов, принятых для выполнения он выше заявления.)

2) Есть ли какой-либо из другие параметры, перечисленные в cpuinfo выше, влияют на это, кроме процессора МГц.

+2

Я отгадать ваш оптимизирующий компилятор не генерирует никакого кода для выражения 'с = (а + Ь) * 11 000;' потому, что он может видеть результат нигде не используется. Вы посмотрели на сборку, которую генерирует ваш компилятор? – Blastfurnace

+2

попробуйте объявить a, b и c как изменчивые –

ответ

2

При использовании rdtsc на X86_64 появляется ошибка. http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21249

тик() должен быть correctd следующим образом:

static inline unsigned long long tick() 
{ 

    unsigned long low, high; 
    __asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high)); 
    return ((unsigned long long)high << 32) | low); 


}