From patchwork Thu Sep 14 17:25:58 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Siddhesh Poyarekar X-Patchwork-Id: 813900 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=sourceware.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=libc-alpha-return-84629-incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.b="iV5B6qfB"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3xtQS05hgmz9s03 for ; Fri, 15 Sep 2017 03:26:24 +1000 (AEST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id; q=dns; s= default; b=tq9oMLOucI63PgHx90jUJmo86/hXcKOxd28BgeI0wTi2MLHKFVbmq CBqQm9I3cHoEcgDPra5WMko07SD0ZeQpGhkyFkKlcnys8U4yhWHgbnPBMU63WHrr kLLM9MsmEI1LP2T1mkxgbAuzQ0I/QQsyZJ3/MvQQSIYXgAVHEIxXXc= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id; s=default; bh=miYRlXZOyZzC+MQio2TYWz8fZHQ=; b=iV5B6qfBZYwHeSyTUPdWmfN8Tsgd IIzqgwveRA13JvYrtuyCvnkqsNvQp/E65P4vjMnTofOz6quE4xQZhOu+aDoTOKWy nHQv1WSalD4qZ/VK2i1YkpYrF10rDlZ5DqU7RiOiKOCNMcAfuqOia+l+W+uEeiDQ zTeQR70XRCiaQOY= Received: (qmail 111300 invoked by alias); 14 Sep 2017 17:26:13 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 110197 invoked by uid 89); 14 Sep 2017 17:26:11 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.1 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_NEUTRAL autolearn=ham version=3.3.2 spammy= X-HELO: homiemail-a83.g.dreamhost.com From: Siddhesh Poyarekar To: libc-alpha@sourceware.org Subject: [COMMITTED 1/2] benchtests: Make memset benchmarks print json Date: Thu, 14 Sep 2017 22:55:58 +0530 Message-Id: <1505409959-6088-1-git-send-email-siddhesh@sourceware.org> 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 +#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; } From patchwork Thu Sep 14 17:25:59 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Siddhesh Poyarekar X-Patchwork-Id: 813901 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=sourceware.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=libc-alpha-return-84630-incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.b="nyfY8Gab"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3xtQSC1R2pz9s03 for ; Fri, 15 Sep 2017 03:26:35 +1000 (AEST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=NcRxmXtIdp30JqtF3ow2Q1F5MYsGOAq +RJPiC+/TICn78eXqJLMwOQCmVtBlMQW0huPv61x7Ypo4a5yCHV7yv5vL8vsi8+o vLxQZDzNMqrxDCWBnSP6itqswNXL6Cj27XMkb9HPMSwzNKsxKa+U53zqo9/OKzgg iCiVcCghGDVo= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; s=default; bh=pG9uE7OV4R+Ma5o9FtFXGJ1TZf4=; b=nyfY8 Gabfjn6aHyibf0iMkbWhBtXXG8uuPNPYqvskOJUIw365cNcL5GEGe4EN2unFbqQc 3V5/kmWOLHwd528npvE47T4MBaY/SC0stRdY6EGezr8ylx4vb64ZyqeN/jbpYacH NMgJkFrUhDAs0ZKvypVuAqf0zGUsGRcWg5HjC0= Received: (qmail 111763 invoked by alias); 14 Sep 2017 17:26:14 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 111202 invoked by uid 89); 14 Sep 2017 17:26:13 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.1 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_NEUTRAL autolearn=ham version=3.3.2 spammy= X-HELO: homiemail-a83.g.dreamhost.com From: Siddhesh Poyarekar To: libc-alpha@sourceware.org Subject: [COMMITTED 2/2] benchtests: Reallocate buffers for memset Date: Thu, 14 Sep 2017 22:55:59 +0530 Message-Id: <1505409959-6088-2-git-send-email-siddhesh@sourceware.org> In-Reply-To: <1505409959-6088-1-git-send-email-siddhesh@sourceware.org> References: <1505409959-6088-1-git-send-email-siddhesh@sourceware.org> 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);