tijd van multi-threading-programma meten

Ik heb de tijd gemeten met de functieklok() maar het gaf slechte resultaten. Ik bedoel, het geeft dezelfde resultaten voor het programma met één thread en voor hetzelfde programma dat wordt uitgevoerd met OpenMP met veel threads. Maar in feite merk ik met mijn horloge dat met veel threads het programma sneller telt. Dus ik heb een wandklok-timer nodig ...

Mijn vraag is: wat is een betere functie voor dit probleem? clock_gettime() of mb gettimeofday ()? of mb iets anders?

if clock_gettime (), met welke klok? CLOCK_REALTIME of CLOCK_MONOTONIC?

met behulp van mac os x (sneeuwluipaard)

1

2 antwoord

Als u wandkloktijd wilt en clock_gettime() beschikbaar is, is dit een goede keuze. Gebruik het met CLOCK_MONOTONIC als u intervallen van tijd meet en CLOCK_REALTIME om de werkelijke tijd van de dag te krijgen.

CLOCK_REALTIME gives you the actual time of day, but is affected by adjustments to the system time -- so if the system time is adjusted while your program runs that will mess up measurements of intervals using it.

CLOCK_MONOTONIC doesn't give you the correct time of day, but it does count at the same rate and is immune to changes to the system time -- so it's ideal for measuring intervals, but useless when correct time of day is needed for display or for timestamps.

3
toegevoegd

Ik denk dat clock() het totale CPU-gebruik van alle threads telt, ik had ook dit probleem ...

De keuze van de tijdklok-timingmethode is persoonlijke voorkeur. Ik gebruik een inline wrapper-functie om tijdstempels te nemen (neem het verschil van 2 tijdstempels om de verwerkingstijd te timen). Ik heb zwevend punt voor het gemak gebruikt (eenheden zijn in seconden, maak je geen zorgen over integer-overloop). Met multi-threading zijn er zoveel asynchrone gebeurtenissen die naar mijn mening niet zinvol zijn tot een tijd lager dan 1 microseconde. Dit heeft tot nu toe heel goed voor me gewerkt :)

Wat u ook kiest, een omhulsel is de gemakkelijkste manier om te experimenteren

inline double my_clock(void) {
  struct timeval t;
  gettimeofday(&t, NULL);
  return (1.0e-6*t.tv_usec + t.tv_sec);
}

gebruik:

double start_time, end_time;
start_time = my_clock();
//some multi-threaded processing
end_time = my_clock();
printf("time is %lf\n", end_time-start_time);
1
toegevoegd