public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [COMMITTED 1/2] benchtests: Make memset benchmarks print json
@ 2017-09-14 17:26 Siddhesh Poyarekar
  2017-09-14 17:26 ` [COMMITTED 2/2] benchtests: Reallocate buffers for memset Siddhesh Poyarekar
  0 siblings, 1 reply; 2+ messages in thread
From: Siddhesh Poyarekar @ 2017-09-14 17:26 UTC (permalink / raw)
  To: libc-alpha

Make the memset benchmarks (bench-memset and bench-memset-large) print
their output in JSON so that they can be evaluated using the
compare_strings.py script.

	* benchtests/bench-memset-large.c: Print output in JSON
	format.
	* benchtests/bench-memset.c: Likewise.
---
 benchtests/bench-memset-large.c | 46 ++++++++++++++++++++++-------
 benchtests/bench-memset.c       | 65 ++++++++++++++++++++++++++++-------------
 2 files changed, 80 insertions(+), 31 deletions(-)

diff --git a/benchtests/bench-memset-large.c b/benchtests/bench-memset-large.c
index d18a05e..c0f1974 100644
--- a/benchtests/bench-memset-large.c
+++ b/benchtests/bench-memset-large.c
@@ -41,6 +41,7 @@
 #endif /* WIDE */
 
 #include <assert.h>
+#include "json-lib.h"
 
 IMPL (MEMSET, 1)
 
@@ -57,7 +58,8 @@ SIMPLE_MEMSET (CHAR *s, int c, size_t n)
 }
 
 static void
-do_one_test (impl_t *impl, CHAR *s, int c __attribute ((unused)), size_t n)
+do_one_test (json_ctx_t *json_ctx, impl_t *impl, CHAR *s,
+	     int c __attribute ((unused)), size_t n)
 {
   size_t i, iters = 16;
   timing_t start, stop, cur;
@@ -71,44 +73,66 @@ do_one_test (impl_t *impl, CHAR *s, int c __attribute ((unused)), size_t n)
 
   TIMING_DIFF (cur, start, stop);
 
-  TIMING_PRINT_MEAN ((double) cur, (double) iters);
+  json_element_double (json_ctx, (double) cur / (double) iters);
 }
 
 static void
-do_test (size_t align, int c, size_t len)
+do_test (json_ctx_t *json_ctx, size_t align, int c, size_t len)
 {
   align &= 63;
   if ((align + len) * sizeof (CHAR) > page_size)
     return;
 
-  printf ("Length %4zd, alignment %2zd, c %2d:", len, align, c);
+  json_element_object_begin (json_ctx);
+  json_attr_uint (json_ctx, "length", len);
+  json_attr_uint (json_ctx, "alignment", align);
+  json_attr_int (json_ctx, "char", c);
+  json_array_begin (json_ctx, "timings");
 
   FOR_EACH_IMPL (impl, 0)
-    do_one_test (impl, (CHAR *) (buf1) + align, c, len);
+    do_one_test (json_ctx, impl, (CHAR *) (buf1) + align, c, len);
 
-  putchar ('\n');
+  json_array_end (json_ctx);
+  json_element_object_end (json_ctx);
 }
 
 int
 test_main (void)
 {
+  json_ctx_t json_ctx;
   size_t i;
   int c;
 
   test_init ();
 
-  printf ("%24s", "");
+  json_init (&json_ctx, 0, stdout);
+
+  json_document_begin (&json_ctx);
+  json_attr_string (&json_ctx, "timing_type", TIMING_TYPE);
+
+  json_attr_object_begin (&json_ctx, "functions");
+  json_attr_object_begin (&json_ctx, TEST_NAME);
+  json_attr_string (&json_ctx, "bench-variant", "large");
+
+  json_array_begin (&json_ctx, "ifuncs");
   FOR_EACH_IMPL (impl, 0)
-    printf ("\t%s", impl->name);
-  putchar ('\n');
+    json_element_string (&json_ctx, impl->name);
+  json_array_end (&json_ctx);
+
+  json_array_begin (&json_ctx, "results");
 
   c = 65;
   for (i = START_SIZE; i <= MIN_PAGE_SIZE; i <<= 1)
     {
-      do_test (0, c, i);
-      do_test (3, c, i);
+      do_test (&json_ctx, 0, c, i);
+      do_test (&json_ctx, 3, c, i);
     }
 
+  json_array_end (&json_ctx);
+  json_attr_object_end (&json_ctx);
+  json_attr_object_end (&json_ctx);
+  json_document_end (&json_ctx);
+
   return ret;
 }
 
diff --git a/benchtests/bench-memset.c b/benchtests/bench-memset.c
index 6b5c57f..107e2b7 100644
--- a/benchtests/bench-memset.c
+++ b/benchtests/bench-memset.c
@@ -42,6 +42,8 @@
 # define MEMCMP wmemcmp
 #endif /* WIDE */
 
+#include "json-lib.h"
+
 CHAR *SIMPLE_MEMSET (CHAR *, int, size_t);
 
 #ifdef TEST_BZERO
@@ -94,7 +96,8 @@ SIMPLE_MEMSET (CHAR *s, int c, size_t n)
 }
 
 static void
-do_one_test (impl_t *impl, CHAR *s, int c __attribute ((unused)), size_t n)
+do_one_test (json_ctx_t *json_ctx, impl_t *impl, CHAR *s,
+	     int c __attribute ((unused)), size_t n)
 {
   size_t i, iters = INNER_LOOP_ITERS;
   timing_t start, stop, cur;
@@ -112,65 +115,87 @@ do_one_test (impl_t *impl, CHAR *s, int c __attribute ((unused)), size_t n)
 
   TIMING_DIFF (cur, start, stop);
 
-  TIMING_PRINT_MEAN ((double) cur, (double) iters);
+  json_element_double (json_ctx, (double) cur / (double) iters);
 }
 
 static void
-do_test (size_t align, int c, size_t len)
+do_test (json_ctx_t *json_ctx, size_t align, int c, size_t len)
 {
   align &= 63;
   if ((align + len) * sizeof (CHAR) > page_size)
     return;
 
-  printf ("Length %4zd, alignment %2zd, c %2d:", len, align, c);
+  json_element_object_begin (json_ctx);
+  json_attr_uint (json_ctx, "length", len);
+  json_attr_uint (json_ctx, "alignment", align);
+  json_attr_int (json_ctx, "char", c);
+  json_array_begin (json_ctx, "timings");
 
   FOR_EACH_IMPL (impl, 0)
-    do_one_test (impl, (CHAR *) (buf1) + align, c, len);
+    do_one_test (json_ctx, impl, (CHAR *) (buf1) + align, c, len);
 
-  putchar ('\n');
+  json_array_end (json_ctx);
+  json_element_object_end (json_ctx);
 }
 
 int
 test_main (void)
 {
+  json_ctx_t json_ctx;
   size_t i;
   int c = 0;
 
   test_init ();
 
-  printf ("%24s", "");
+  json_init (&json_ctx, 0, stdout);
+
+  json_document_begin (&json_ctx);
+  json_attr_string (&json_ctx, "timing_type", TIMING_TYPE);
+
+  json_attr_object_begin (&json_ctx, "functions");
+  json_attr_object_begin (&json_ctx, TEST_NAME);
+  json_attr_string (&json_ctx, "bench-variant", "");
+
+  json_array_begin (&json_ctx, "ifuncs");
   FOR_EACH_IMPL (impl, 0)
-    printf ("\t%s", impl->name);
-  putchar ('\n');
+    json_element_string (&json_ctx, impl->name);
+  json_array_end (&json_ctx);
+
+  json_array_begin (&json_ctx, "results");
 
 #ifndef TEST_BZERO
   for (c = -65; c <= 130; c += 65)
 #endif
     {
       for (i = 0; i < 18; ++i)
-	do_test (0, c, 1 << i);
+	do_test (&json_ctx, 0, c, 1 << i);
       for (i = 1; i < 32; ++i)
 	{
-	  do_test (i, c, i);
+	  do_test (&json_ctx, i, c, i);
 	  if (i & (i - 1))
-	    do_test (0, c, i);
+	    do_test (&json_ctx, 0, c, i);
 	}
       for (i = 32; i < 512; i+=32)
 	{
-	  do_test (0, c, i);
-	  do_test (i, c, i);
+	  do_test (&json_ctx, 0, c, i);
+	  do_test (&json_ctx, i, c, i);
 	}
-      do_test (1, c, 14);
-      do_test (3, c, 1024);
-      do_test (4, c, 64);
-      do_test (2, c, 25);
+      do_test (&json_ctx, 1, c, 14);
+      do_test (&json_ctx, 3, c, 1024);
+      do_test (&json_ctx, 4, c, 64);
+      do_test (&json_ctx, 2, c, 25);
     }
   for (i = 33; i <= 256; i += 4)
     {
-      do_test (0, c, 32 * i);
-      do_test (i, c, 32 * i);
+      do_test (&json_ctx, 0, c, 32 * i);
+      do_test (&json_ctx, i, c, 32 * i);
     }
 
+  json_array_end (&json_ctx);
+  json_attr_object_end (&json_ctx);
+  json_attr_object_end (&json_ctx);
+  json_document_end (&json_ctx);
+
   return ret;
 }
 
-- 
2.7.4

^ permalink raw reply	[flat|nested] 2+ messages in thread

* [COMMITTED 2/2] benchtests: Reallocate buffers for memset
  2017-09-14 17:26 [COMMITTED 1/2] benchtests: Make memset benchmarks print json Siddhesh Poyarekar
@ 2017-09-14 17:26 ` Siddhesh Poyarekar
  0 siblings, 0 replies; 2+ messages in thread
From: Siddhesh Poyarekar @ 2017-09-14 17:26 UTC (permalink / raw)
  To: libc-alpha

Keeping the same buffers along with copying the same size of data into
the same location means that the first routine is typically the
slowest since it has to bear the cost of fetching data into to cache.
Reallocating buffers stabilizes numbers by a bit.

	* benchtests/bench-string.h (realloc_bufs): New function.
	(test_init): Call it.
	* benchtests/bench-memset-large.c (do_test): Likewise.
	* benchtests/bench-memset.c (do_test): Likewise.
---
 benchtests/bench-memset-large.c |  5 ++++-
 benchtests/bench-memset.c       |  5 ++++-
 benchtests/bench-string.h       | 50 ++++++++++++++++++++++++++++++++---------
 3 files changed, 47 insertions(+), 13 deletions(-)

diff --git a/benchtests/bench-memset-large.c b/benchtests/bench-memset-large.c
index c0f1974..6cd48c9 100644
--- a/benchtests/bench-memset-large.c
+++ b/benchtests/bench-memset-large.c
@@ -90,7 +90,10 @@ do_test (json_ctx_t *json_ctx, size_t align, int c, size_t len)
   json_array_begin (json_ctx, "timings");
 
   FOR_EACH_IMPL (impl, 0)
-    do_one_test (json_ctx, impl, (CHAR *) (buf1) + align, c, len);
+    {
+      do_one_test (json_ctx, impl, (CHAR *) (buf1) + align, c, len);
+      realloc_bufs ();
+    }
 
   json_array_end (json_ctx);
   json_element_object_end (json_ctx);
diff --git a/benchtests/bench-memset.c b/benchtests/bench-memset.c
index 107e2b7..724c105 100644
--- a/benchtests/bench-memset.c
+++ b/benchtests/bench-memset.c
@@ -132,7 +132,10 @@ do_test (json_ctx_t *json_ctx, size_t align, int c, size_t len)
   json_array_begin (json_ctx, "timings");
 
   FOR_EACH_IMPL (impl, 0)
-    do_one_test (json_ctx, impl, (CHAR *) (buf1) + align, c, len);
+    {
+      do_one_test (json_ctx, impl, (CHAR *) (buf1) + align, c, len);
+      realloc_bufs ();
+    }
 
   json_array_end (json_ctx);
   json_element_object_end (json_ctx);
diff --git a/benchtests/bench-string.h b/benchtests/bench-string.h
index 3aacfdf..40c735c 100644
--- a/benchtests/bench-string.h
+++ b/benchtests/bench-string.h
@@ -173,14 +173,8 @@ static impl_t *impl_array;
 # endif
 
 static void
-test_init (void)
+alloc_bufs (void)
 {
-# ifdef TEST_NAME
-  func_count = __libc_ifunc_impl_list (TEST_NAME, func_list,
-				       (sizeof func_list
-					/ sizeof func_list[0]));
-# endif
-
   page_size = 2 * getpagesize ();
 # ifdef MIN_PAGE_SIZE
   if (page_size < MIN_PAGE_SIZE)
@@ -189,15 +183,49 @@ test_init (void)
   buf1 = mmap (0, (BUF1PAGES + 1) * page_size, PROT_READ | PROT_WRITE,
 	       MAP_PRIVATE | MAP_ANON, -1, 0);
   if (buf1 == MAP_FAILED)
-    error (EXIT_FAILURE, errno, "mmap failed");
+    error (EXIT_FAILURE, errno, "mmap failed for buf1");
   if (mprotect (buf1 + BUF1PAGES * page_size, page_size, PROT_NONE))
-    error (EXIT_FAILURE, errno, "mprotect failed");
+    error (EXIT_FAILURE, errno, "mprotect failed for buf1");
   buf2 = mmap (0, 2 * page_size, PROT_READ | PROT_WRITE,
 	       MAP_PRIVATE | MAP_ANON, -1, 0);
   if (buf2 == MAP_FAILED)
-    error (EXIT_FAILURE, errno, "mmap failed");
+    error (EXIT_FAILURE, errno, "mmap failed for buf2");
   if (mprotect (buf2 + page_size, page_size, PROT_NONE))
-    error (EXIT_FAILURE, errno, "mprotect failed");
+    error (EXIT_FAILURE, errno, "mprotect failed for buf2");
+}
+
+static void
+__attribute__ ((unused))
+realloc_bufs (void)
+{
+  int ret = 0;
+
+  if (buf1)
+    ret = munmap (buf1, (BUF1PAGES + 1) * page_size);
+
+  if (ret != 0)
+    error (EXIT_FAILURE, errno, "munmap failed for buf1");
+
+  if (buf2)
+    ret = munmap (buf2, 2 * page_size);
+
+  if (ret != 0)
+    error (EXIT_FAILURE, errno, "munmap failed for buf2");
+
+  alloc_bufs ();
+}
+
+static void
+test_init (void)
+{
+# ifdef TEST_NAME
+  func_count = __libc_ifunc_impl_list (TEST_NAME, func_list,
+				       (sizeof func_list
+					/ sizeof func_list[0]));
+# endif
+
+  alloc_bufs ();
+
   if (do_srandom)
     {
       printf ("Setting seed to 0x%x\n", seed);
-- 
2.7.4

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2017-09-14 17:26 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-09-14 17:26 [COMMITTED 1/2] benchtests: Make memset benchmarks print json Siddhesh Poyarekar
2017-09-14 17:26 ` [COMMITTED 2/2] benchtests: Reallocate buffers for memset Siddhesh Poyarekar

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).