çoklu iş parçacığı programının ölçüm süresi

Fonksiyon clock() ile zaman ölçtüm ama kötü sonuçlar verdi. Yani, bir iş parçacığı ile program için aynı sonuçları verir ve aynı program için birçok iş parçacığı ile OpenMP ile çalışır. Ama aslında, birçok iş parçacığı programı ile daha hızlı sayar saatim ile dikkat edin. Bu yüzden duvar saati zamanlayıcısına ihtiyacım var ...

Sorum şu: Bu sorun için daha iyi işlev nedir? clock_gettime() veya mb gettimeofday ()? ya da başka bir şey mi?

eğer clock_gettime (), hangi saatte? CLOCK_REALTIME veya CLOCK_MONOTONIC?

mac os x kullanarak (kar leopar)

1

2 cevap

Duvar saati saati ve clock_gettime() seçeneği varsa, bu iyi bir seçimdir. Zaman aralıklarını ölçüyorsanız CLOCK_MONOTONIC ile ve günün gerçek zamanını öğrenmek için CLOCK_REALTIME ile kullanın.

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
katma

Saat() tüm iş parçacıkları arasında toplam CPU kullanımını sayar, bu problemi de yaşadım ...

Duvar saati zamanlama yönteminin seçimi kişisel tercihtir. Zaman damgası almak için satır içi sarıcı işlevini kullanıyorum (işleminize zaman ayırmak için 2 zaman damgası farkını kullanın). Kolaylık için kayan nokta kullandım (birimler saniyeler içinde, tamsayı taşması konusunda endişelenmenize gerek yok). Çoklu iş parçacığı ile, benim düşüncemde 1 mikrosaniyenin altında zaman anlamında mantıklı olmayan birçok asenkron olay var. Bu şimdiye kadar benim için çok iyi çalıştı :)

Ne seçerseniz seçin, bir sarıcı denemenin en kolay yoludur

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

kullanımı:

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
katma