webForumDet fria alternativet

Timestamp i millisekunder

28 svar · 1 849 visningar · startad av Compusa · sida 2 av 2

CompusaMedlem sedan jan. 20023 327 inlägg
#21

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.

niklas_sMedlem sedan juli 20055 inlägg
#22

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
#23

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
#24

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;
}
Sang-draxMedlem sedan juli 2002581 inlägg
#25

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
#26

Hur skulle det se ut i min kod? Osäker på hur man använder den.

niklas_sMedlem sedan juli 20055 inlägg
#27

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.

Sang-draxMedlem sedan juli 2002581 inlägg
#28

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
#29

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?

261 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
131 ms — hämta forumlista (db)
127 ms — hämta statistik (db)
121 ms — hämta tråd, inlägg och bilagor (db)