From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from cichlid.ash.relay.mailchannels.net (cichlid.ash.relay.mailchannels.net [23.83.222.36]) by sourceware.org (Postfix) with ESMTPS id 7DFBA383E6A5 for ; Mon, 23 May 2022 07:44:21 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 7DFBA383E6A5 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=gotplt.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gotplt.org X-Sender-Id: dreamhost|x-authsender|siddhesh@gotplt.org Received: from relay.mailchannels.net (localhost [127.0.0.1]) by relay.mailchannels.net (Postfix) with ESMTP id F32C9821C22; Mon, 23 May 2022 07:44:18 +0000 (UTC) Received: from pdx1-sub0-mail-a305.dreamhost.com (unknown [127.0.0.6]) (Authenticated sender: dreamhost) by relay.mailchannels.net (Postfix) with ESMTPA id A7635821A39; Mon, 23 May 2022 07:44:13 +0000 (UTC) ARC-Seal: i=1; s=arc-2022; d=mailchannels.net; t=1653291858; a=rsa-sha256; cv=none; b=pLytd3dvIgUJDH1DEU5N1cLQbWCdC7syQQANcDqo+ze1RcZ9bEAHfSOsY648N4g2VpqR++ uLAuUFyEnWutoM1Xcow28Tnq/FyeHDFQ+hoMVE2TFuKkoUdbI0rbMAl+9TwtADBfz4NXRZ 6NQh2sTXImFz8PelZ0v61R9KCEEypI13CIz7uladR635RLuQ4O3Ch2JNHSjNgodzqZoGc7 qdFQfZP4TKrQ+k8jLh5n+Xyp+H6s9htaoVMV6G8HaK9TZBIXhwTO8vpgdkqdHAYffs4D91 au/LiQf6oX28zVa6LUFqew5ica1MewjZnchQoY8lh06+Nb+QKKMN/Cfrd7DYew== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=mailchannels.net; s=arc-2022; t=1653291858; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=OT2POcTzEGss3oW9tyuV6R4/NwD7sKoZCOLn+pn0EGk=; b=+EWNKSZqDRwVTUHoN9fnAaXTwussfqwrB+sXOuDtEDMyYtz4F0JjoalK0EKz82f1lmsD8W 7R4y3JfSgesx+HpYRFQHvj77dTyVmabsIH7GwZJpTuoGQ7cDGRjzWIaJKVxZ6+aj4Xi5te Wy+l6LwYVntO9dTz1uwtrImsM7hP127AiUVVoFUs7IqFzENwDLBPpWpLGbI3s+K8dUVwlM efPZ0BFytldVGJNYgyL8Yav7/NTnWdrSKMba6En2KRUW+eTYDij8b7bvd6VQr0wwRXf6AY VZLWGDu9zB/F15RuwqP1/RsiNZUdDgQ4T/tP1b5W7Nz6SH/pmQGpNp3Dj+/V9g== ARC-Authentication-Results: i=1; rspamd-696cff8778-kk2bw; auth=pass smtp.auth=dreamhost smtp.mailfrom=siddhesh@gotplt.org X-Sender-Id: dreamhost|x-authsender|siddhesh@gotplt.org X-MC-Relay: Neutral X-MailChannels-SenderId: dreamhost|x-authsender|siddhesh@gotplt.org X-MailChannels-Auth-Id: dreamhost X-Hysterical-Whispering: 0de32a1d05ff158f_1653291858805_127489989 X-MC-Loop-Signature: 1653291858805:2802065143 X-MC-Ingress-Time: 1653291858805 Received: from pdx1-sub0-mail-a305.dreamhost.com (pop.dreamhost.com [64.90.62.162]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384) by 100.98.242.203 (trex/6.7.1); Mon, 23 May 2022 07:44:18 +0000 Received: from [100.96.149.178] (unknown [49.248.235.144]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) (Authenticated sender: siddhesh@gotplt.org) by pdx1-sub0-mail-a305.dreamhost.com (Postfix) with ESMTPSA id 4L68V40JZkz4F; Mon, 23 May 2022 00:44:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gotplt.org; s=dreamhost; t=1653291853; bh=OT2POcTzEGss3oW9tyuV6R4/NwD7sKoZCOLn+pn0EGk=; h=Date:Subject:To:From:Content-Type:Content-Transfer-Encoding; b=Sj3FUsUti1VSEsNiaw2p68lNPuxjdNE35PK3kh5TYsG8IuWh9FiwAgv/qVw0imxuG joSDhLxoswMGBiy9fucMRz2Dc7x9pPV+/gVK/sy+3oihLoXgnG/VjmkDROToS3LGSz BOpen2i847dCLib2ujZOyt4N7MVvd5j8vp5vWzV6a4o0blT5fSfP5NsE5tvoPA2UZT hc9WMSmZIgOBve3zll4t8lwbT8RUQzHFaFCRjrmixHkeJSmhlN5o2mHj/2dHd15AW6 PfpsavYkGKGp9NoC4IKAGgu8fyRpa98hw6rM+BLnydbAi8Hr1T+TMXLyGGcEnkg19B j0mvQgyXoMCbw== Message-ID: Date: Mon, 23 May 2022 13:14:08 +0530 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.8.0 Subject: Re: [PATCH v11 4/6] benchtests: Add benchtests for dl_elf_hash, dl_new_hash and nss_hash Content-Language: en-US To: Noah Goldstein , libc-alpha@sourceware.org References: <20220414041231.926415-1-goldstein.w.n@gmail.com> <20220519221803.57957-1-goldstein.w.n@gmail.com> <20220519221803.57957-4-goldstein.w.n@gmail.com> From: Siddhesh Poyarekar In-Reply-To: <20220519221803.57957-4-goldstein.w.n@gmail.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-3039.8 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, NICE_REPLY_A, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 23 May 2022 07:44:26 -0000 On 20/05/2022 03:48, Noah Goldstein via Libc-alpha wrote: > Benchtests are for throughput and include random / fixed size > benchmarks. > --- > benchtests/Makefile | 25 ++++- > benchtests/README | 9 +- > benchtests/bench-dl-elf-hash.c | 27 +++++ > benchtests/bench-dl-new-hash.c | 25 +++++ > benchtests/bench-hash-funcs-kernel.h | 86 ++++++++++++++++ > benchtests/bench-hash-funcs.c | 145 +++++++++++++++++++++++++++ > benchtests/bench-nss-hash.c | 26 +++++ > 7 files changed, 335 insertions(+), 8 deletions(-) > create mode 100644 benchtests/bench-dl-elf-hash.c > create mode 100644 benchtests/bench-dl-new-hash.c > create mode 100644 benchtests/bench-hash-funcs-kernel.h > create mode 100644 benchtests/bench-hash-funcs.c > create mode 100644 benchtests/bench-nss-hash.c OK. Reviewed-by: Siddhesh Poyarekar > > diff --git a/benchtests/Makefile b/benchtests/Makefile > index de9de5cf58..c279041e19 100644 > --- a/benchtests/Makefile > +++ b/benchtests/Makefile > @@ -227,6 +227,12 @@ LOCALES := \ > include ../gen-locales.mk > endif > > +hash-benchset := \ > + dl-elf-hash \ > + dl-new-hash \ > + nss-hash \ > +# hash-benchset > + > stdlib-benchset := strtod > > stdio-common-benchset := sprintf > @@ -235,7 +241,7 @@ math-benchset := math-inlines > > ifeq (${BENCHSET},) > benchset := $(string-benchset-all) $(stdlib-benchset) $(stdio-common-benchset) \ > - $(math-benchset) > + $(math-benchset) $(hash-benchset) > else > benchset := $(foreach B,$(filter %-benchset,${BENCHSET}), ${${B}}) > endif > @@ -363,9 +369,20 @@ bench-clean: > > # Validate the passed in BENCHSET > ifneq ($(strip ${BENCHSET}),) > -VALIDBENCHSETNAMES := bench-pthread bench-math bench-string string-benchset \ > - wcsmbs-benchset stdlib-benchset stdio-common-benchset math-benchset \ > - malloc-thread malloc-simple > +VALIDBENCHSETNAMES := \ > + bench-math \ > + bench-pthread \ > + bench-string \ > + hash-benchset \ > + malloc-simple \ > + malloc-thread \ > + math-benchset \ > + stdio-common-benchset \ > + stdlib-benchset \ > + string-benchset \ > + wcsmbs-benchset \ > +# VALIDBENCHSETNAMES > + > INVALIDBENCHSETNAMES := $(filter-out ${VALIDBENCHSETNAMES},${BENCHSET}) > ifneq (${INVALIDBENCHSETNAMES},) > $(info The following values in BENCHSET are invalid: ${INVALIDBENCHSETNAMES}) > diff --git a/benchtests/README b/benchtests/README > index 4d83a05b4b..998ba9b2b4 100644 > --- a/benchtests/README > +++ b/benchtests/README > @@ -84,12 +84,13 @@ where BENCHSET may be a space-separated list of the following values: > bench-math > bench-pthread > bench-string > + hash-benchset > + malloc-thread > + math-benchset > + stdio-common-benchset > + stdlib-benchset > string-benchset > wcsmbs-benchset > - stdlib-benchset > - stdio-common-benchset > - math-benchset > - malloc-thread > > Adding a function to benchtests: > =============================== > diff --git a/benchtests/bench-dl-elf-hash.c b/benchtests/bench-dl-elf-hash.c > new file mode 100644 > index 0000000000..067de9fca4 > --- /dev/null > +++ b/benchtests/bench-dl-elf-hash.c > @@ -0,0 +1,27 @@ > +/* Measure __dl_new_hash runtime > + Copyright (C) 2022 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + . */ > + > +#include > +#include > +#define TEST_FUNC(x, y) _dl_elf_hash (x) > +#define SIMPLE_TEST_FUNC(x, y) __simple_dl_elf_hash (x) > + > +#define TEST_NAME "_dl_elf_hash" > + > + > +#include "bench-hash-funcs.c" > diff --git a/benchtests/bench-dl-new-hash.c b/benchtests/bench-dl-new-hash.c > new file mode 100644 > index 0000000000..3c8a1d5a82 > --- /dev/null > +++ b/benchtests/bench-dl-new-hash.c > @@ -0,0 +1,25 @@ > +/* Measure __dl_new_hash runtime > + Copyright (C) 2022 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + . */ > + > +#include > +#define TEST_FUNC(x, y) _dl_new_hash (x) > +#define SIMPLE_TEST_FUNC(x, y) __simple_dl_new_hash (x) > + > +#define TEST_NAME "_dl_new_hash" > + > +#include "bench-hash-funcs.c" > diff --git a/benchtests/bench-hash-funcs-kernel.h b/benchtests/bench-hash-funcs-kernel.h > new file mode 100644 > index 0000000000..83995cc0ae > --- /dev/null > +++ b/benchtests/bench-hash-funcs-kernel.h > @@ -0,0 +1,86 @@ > +/* Actual benchmark kernels used by bench-hash-funcs.h > + Copyright (C) 2022 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + . */ > + > + > + > +/* We go through the trouble of using macros here because many of the > + hash functions are meant to be inlined so its not fair to benchmark > + them with a function pointer where they won't be inlinable. */ > +#undef RUN_FUNC > +#undef POSTFIX > +#ifdef SIMPLE > +# define RUN_FUNC SIMPLE_TEST_FUNC > +# define POSTFIX _simple > +#else > +# define RUN_FUNC TEST_FUNC > +# define POSTFIX _optimized > +#endif > + > +#define PRIMITIVE_CAT(x, y) x ## y > +#define CAT(x, y) PRIMITIVE_CAT (x, y) > + > +static double __attribute__ ((noinline, noclone)) > +CAT (do_one_test_kernel, POSTFIX) (const char *s, size_t len) > +{ > + > + unsigned int iters; > + timing_t start, stop, cur; > + > + /* Warmup. */ > + for (iters = NFIXED_ITERS / 32; iters; --iters) > + DO_NOT_OPTIMIZE_OUT (RUN_FUNC (s, len)); > + > + TIMING_NOW (start); > + for (iters = NFIXED_ITERS; iters; --iters) > + DO_NOT_OPTIMIZE_OUT (RUN_FUNC (s, len)); > + > + TIMING_NOW (stop); > + > + TIMING_DIFF (cur, start, stop); > + > + (void) (len); > + return (double) cur / (double) NFIXED_ITERS; > +} > + > +static double __attribute__ ((noinline, noclone)) > +CAT (do_rand_test_kernel, POSTFIX) (char const *bufs, > + unsigned int const *sizes) > +{ > + unsigned int i, iters; > + size_t offset; > + timing_t start, stop, cur; > + > + /* Warmup. */ > + for (i = 0, offset = 0; i < NRAND_BUFS; ++i, offset += RAND_BENCH_MAX_LEN) > + DO_NOT_OPTIMIZE_OUT (RUN_FUNC (bufs + offset, sizes[i])); > + > + TIMING_NOW (start); > + for (iters = NRAND_ITERS; iters; --iters) > + { > + for (i = 0, offset = 0; i < NRAND_BUFS; > + ++i, offset += RAND_BENCH_MAX_LEN) > + DO_NOT_OPTIMIZE_OUT (RUN_FUNC (bufs + offset, sizes[i])); > + > + } > + TIMING_NOW (stop); > + > + TIMING_DIFF (cur, start, stop); > + > + (void) (sizes); > + return (double) cur / (double) (NRAND_ITERS * NRAND_BUFS); > +} > diff --git a/benchtests/bench-hash-funcs.c b/benchtests/bench-hash-funcs.c > new file mode 100644 > index 0000000000..578c5cbae2 > --- /dev/null > +++ b/benchtests/bench-hash-funcs.c > @@ -0,0 +1,145 @@ > +/* Measure hash functions runtime. > + Copyright (C) 2022 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + . */ > + > +#define TEST_MAIN > +#ifndef TEST_FUNC > +# error "No TEST_FUNC provided!" > +#endif > +#ifndef SIMPLE_TEST_FUNC > +# error "No SIMPLE_TEST_FUNC provided!" > +#endif > + > +#ifndef TEST_NAME > +# define STRINGIFY_PRIMITIVE(x) # x > +# define STRINGIFY(x) STRINGIFY_PRIMITIVE (x) > + > +# define TEST_NAME STRINGIFY (TEST_FUNC) > +#endif > + > +#include "json-lib.h" > +#include "bench-timing.h" > + > +#include > +#include > +#include > + > +#define DO_NOT_OPTIMIZE_OUT(x) __asm__ volatile("" : : "r,m"(x) : "memory") > + > +enum > +{ > + NFIXED_ITERS = 1048576, > + NRAND_BUFS = 16384, > + NRAND_ITERS = 2048, > + RAND_BENCH_MAX_LEN = 128 > +}; > + > +#include "bench-hash-funcs-kernel.h" > +#define SIMPLE > +#include "bench-hash-funcs-kernel.h" > + > +static void > +do_one_test (json_ctx_t *json_ctx, size_t len) > +{ > + char buf[len + 1]; > + memset (buf, -1, len); > + buf[len] = '\0'; > + > + json_element_object_begin (json_ctx); > + > + json_attr_string (json_ctx, "type", "fixed"); > + json_attr_uint (json_ctx, "length", len); > + json_attr_double (json_ctx, "time_simple", do_one_test_kernel_simple (buf, len)); > + json_attr_double (json_ctx, "time_optimized", do_one_test_kernel_optimized (buf, len)); > + > + json_element_object_end (json_ctx); > +} > + > +static void __attribute__ ((noinline, noclone)) > +do_rand_test (json_ctx_t *json_ctx) > +{ > + size_t i, sz, offset; > + char *bufs; > + unsigned int *sizes; > + > + bufs = (char *) calloc (NRAND_BUFS, RAND_BENCH_MAX_LEN); > + sizes = (unsigned int *) calloc (NRAND_BUFS, sizeof (unsigned int)); > + if (bufs == NULL || sizes == NULL) > + { > + fprintf (stderr, "Failed to allocate bufs for random test\n"); > + goto done; > + } > + > + for (sz = 2; sz <= RAND_BENCH_MAX_LEN; sz += sz) > + { > + json_element_object_begin (json_ctx); > + json_attr_string (json_ctx, "type", "random"); > + json_attr_uint (json_ctx, "length", sz); > + > + for (i = 0, offset = 0; i < NRAND_BUFS; > + ++i, offset += RAND_BENCH_MAX_LEN) > + { > + sizes[i] = random () % sz; > + memset (bufs + offset, -1, sizes[i]); > + bufs[offset + sizes[i]] = '\0'; > + } > + > + json_attr_double (json_ctx, "time_simple", > + do_rand_test_kernel_simple (bufs, sizes)); > + json_attr_double (json_ctx, "time_optimized", > + do_rand_test_kernel_optimized (bufs, sizes)); > + json_element_object_end (json_ctx); > + } > + > +done: > + if (bufs) > + free (bufs); > + > + if (sizes) > + free (sizes); > +} > + > +static int > +do_test (void) > +{ > + int i; > + json_ctx_t json_ctx; > + > + 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_array_begin (&json_ctx, "results"); > + > + for (i = 0; i < 16; ++i) > + do_one_test (&json_ctx, i); > + > + for (i = 16; i <= 256; i += i) > + do_one_test (&json_ctx, i); > + > + do_rand_test (&json_ctx); > + > + json_array_end (&json_ctx); > + json_attr_object_end (&json_ctx); > + json_attr_object_end (&json_ctx); > + json_document_end (&json_ctx); > + > + return 0; > +} > + > +#include > diff --git a/benchtests/bench-nss-hash.c b/benchtests/bench-nss-hash.c > new file mode 100644 > index 0000000000..7e369428a2 > --- /dev/null > +++ b/benchtests/bench-nss-hash.c > @@ -0,0 +1,26 @@ > +/* Measure __nss_hash runtime > + Copyright (C) 2022 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + . */ > + > +#include > +#include > +#define TEST_FUNC __nss_hash > +#define SIMPLE_TEST_FUNC __simple_nss_hash > + > +uint32_t __nss_hash (const void *__key, size_t __length); > + > +#include "bench-hash-funcs.c"