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 @@ -6,71 +6,25 @@ #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; - 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; -} +#define ASSERT_CMP(lhs, cmp, rhs) \ + if (!((lhs)cmp(rhs))) { \ + printf("Expected: (" #lhs ") " #cmp " (" #rhs "), actual: %e vs. %e", lhs, \ + rhs); \ + return EXIT_FAILURE; \ + } 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); + int i; - // Get each timing for (i = 0; i < NTIMES; i++) { - times[i] = test_omp_get_wtime(wait_time); + double start = omp_get_wtime(), end; + ASSERT_CMP(start, >=, 0.0); + for (end = omp_get_wtime(); end == start; end = omp_get_wtime()) { + ASSERT_CMP(end, >=, 0.0); + } + ASSERT_CMP(end, >=, 0.0); + ASSERT_CMP(end, >, start); } - // 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); - return EXIT_FAILURE; - } - printf("pass: average of %d runs (%lf) is only off by %lf%%\n", NTIMES, - average, percent_off); return EXIT_SUCCESS; }