Я написал очень простую программу 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 выше, влияют на это, кроме процессора МГц.
Я отгадать ваш оптимизирующий компилятор не генерирует никакого кода для выражения 'с = (а + Ь) * 11 000;' потому, что он может видеть результат нигде не используется. Вы посмотрели на сборку, которую генерирует ваш компилятор? – Blastfurnace
попробуйте объявить a, b и c как изменчивые –