diff --git a/openmp/runtime/test/api/omp_get_wtime.c b/openmp/runtime/test/api/omp_get_wtime.c --- a/openmp/runtime/test/api/omp_get_wtime.c +++ b/openmp/runtime/test/api/omp_get_wtime.c @@ -4,73 +4,29 @@ #include "omp_testsuite.h" #include "omp_my_sleep.h" -#define NTIMES 100 - -// This is the error % threshold. Be generous with the error threshold since -// this test may be run in parallel with many other tests it may throw off the -// sleep timing. -#define THRESHOLD 100.0 - -double test_omp_get_wtime(double desired_wait_time) { - double start; - double end; - start = 0; - end = 0; +// Return 0 if success, 1 if failure +// +// Trying to test a precise elapsed wall clock time is impossible due to +// non-deterministic workloads on the test machine and OS scheduling quirks +// which may affect the timing of the test. +// +// Only test that a successive call to omp_get_wtime() +// returns a larger (or equal) value than the previous call. +int test_omp_get_wtime() { + double start, stop; start = omp_get_wtime(); - my_sleep(desired_wait_time); - end = omp_get_wtime(); - return end - start; -} - -int compare_times(const void *lhs, const void *rhs) { - const double *a = (const double *)lhs; - const double *b = (const double *)rhs; - return *a - *b; + my_sleep(0.05); + stop = omp_get_wtime(); + if (start > stop) + return 1; + return 0; } int main() { - int i, final_count; - double percent_off; - double *begin, *end, *ptr; - double wait_time = 0.01; - double average = 0.0; - double n = 0.0; - double *times = (double *)malloc(sizeof(double) * NTIMES); - - // Get each timing - for (i = 0; i < NTIMES; i++) { - times[i] = test_omp_get_wtime(wait_time); - } - - // Remove approx the "worst" tenth of the timings - qsort(times, NTIMES, sizeof(double), compare_times); - begin = times; - end = times + NTIMES; - for (i = 0; i < NTIMES / 10; ++i) { - if (i % 2 == 0) - begin++; - else - end--; - } - - // Get the average of the remaining timings - for (ptr = begin, final_count = 0; ptr != end; ++ptr, ++final_count) - average += times[i]; - average /= (double)final_count; - free(times); - - // Calculate the percent off of desired wait time - percent_off = (average - wait_time) / wait_time * 100.0; - // Should always be positive, but just in case - if (percent_off < 0) - percent_off = -percent_off; - - if (percent_off > (double)THRESHOLD) { - fprintf(stderr, "error: average of %d runs (%lf) is of by %lf%%\n", NTIMES, - average, percent_off); + int i, errs = 0; + for (i = 0; i < REPETITIONS; ++i) + errs += test_omp_get_wtime(); + if (errs) return EXIT_FAILURE; - } - printf("pass: average of %d runs (%lf) is only off by %lf%%\n", NTIMES, - average, percent_off); return EXIT_SUCCESS; }