[Openmp-commits] [PATCH] D112458: [OpenMP] [test] Test omp_get_wtime for invariants

Joachim Protze via Phabricator via Openmp-commits openmp-commits at lists.llvm.org
Mon Oct 25 07:55:29 PDT 2021


protze.joachim created this revision.
protze.joachim added reviewers: jlpeyton, ronlieb, JonChesterfield.
protze.joachim added a project: OpenMP.
Herald added subscribers: guansong, yaxunl.
protze.joachim requested review of this revision.
Herald added a reviewer: jdoerfert.
Herald added a subscriber: sstefan1.

As discussed in D108488 <https://reviews.llvm.org/D108488>, testing for invariants of omp_get_wtime would be more reliable than testing for duration of sleep, as return from sleep might be delayed due to system load.

Alternatively/in addition, we could compare the time measured by omp_get_wtime to time measured with C++11 chrono (for portability?).


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D112458

Files:
  openmp/runtime/test/api/omp_get_wtime.c


Index: openmp/runtime/test/api/omp_get_wtime.c
===================================================================
--- openmp/runtime/test/api/omp_get_wtime.c
+++ 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;
 }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D112458.381993.patch
Type: text/x-patch
Size: 2853 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/openmp-commits/attachments/20211025/b4b4f0de/attachment.bin>


More information about the Openmp-commits mailing list