CompusaMedlem sedan jan. 20023 327 inlägg Jag får följande kompileringsfel när jag försöker med Niklas exempel:
"Undefined reference to "_rdtsc" samt "collect2: ld returned 1 exit status"
Läste mer om det exempel Niklas visade och det verkar bara gå på Pentium?
Jag kompilerar med ggc under cygwin.
Man måste ange en O-flagga, tex -O2. Annars får man ett fel.
Det är riktigt att det endast fungerar på pentium.
CompusaMedlem sedan jan. 20023 327 inlägg Denna fungerar om man ändrar funktionen från extern till static....
#include <stdio.h>
#include <time.h>
static __inline__ unsigned long long int rdtsc() {
unsigned long long int x;
__asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));
return x;
}
int main(void) {
unsigned long long t1, t2;
t1 = rdtsc(); // Hämta clk från CPU.
sleep(10); // Vänta 10 sekunder.
t2 = rdtsc(); // Hämta clk från CPU.
printf("=== Klockfrekvens: %G MHz ===\n", (double)((t2-t1)/1000)/10000);
}
Har dock fått ordning på min andra funktion, återkommer med mitt svar för eventuell förbättring.
CompusaMedlem sedan jan. 20023 327 inlägg Så här ser koden ut på den lösning som jag tänkt bygga vidare. Hur tror du denna verkar Sang-drax? :q
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
/* Assembler directive to execute the instruction
rdtsc, read Time-Stamp Counter, should work
in gcc at least. */
#define rdtsc(low,high) \
__asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high))
/* Start timer by calling timer_start(). Stop timer and get number
of cycles by calling timer_finish(). */
static unsigned long long starttime = 0;
static inline unsigned long long rdtsc_read(void)
{
unsigned long high, low;
rdtsc(low,high);
return ((unsigned long long)high << 32) | low;
}
void timer_start(void)
{
starttime = rdtsc_read();
}
unsigned long long timer_finish(void)
{
return rdtsc_read() - starttime;
}
Jag har ingen aning om varför Niklas hade "extrern" framför metoden. Det verkar skumt.
Som jag sade tidigare bör du köra instruktionen "cpuid" innan varje rdtsc.
CompusaMedlem sedan jan. 20023 327 inlägg Hur skulle det se ut i min kod? Osäker på hur man använder den.
Där jag hämtade koden var den "extern". Vill du gå till originalkällan så är det bara söka på "_inline_ unsigned long long int rdtsc" i Google. Jag får 85 träffar på det. Från någon av dem är koden hämtad.
niklas_s skrev:
Där jag hämtade koden var den "extern".
Saken är den att alla funktioner är "extern" som standard, så extern gör i detta fall ingenting.
CompusaMedlem sedan jan. 20023 327 inlägg
Sang-drax skrev:
Jag har ingen aning om varför Niklas hade "extrern" framför metoden. Det verkar skumt.
Som jag sade tidigare bör du köra instruktionen "cpuid" innan varje rdtsc.
Hur ska jag tiilväga för att göra detta i min kod?