From e6b7e585746259fc86b98d97fabe2016186d61d7 Mon Sep 17 00:00:00 2001 From: Jim Harris Date: Thu, 6 May 2021 21:43:05 +0000 Subject: [PATCH] examples: add zipf example app This app shows how to use the SPDK zipf functionality, and uses spdk_histogram to show the cumulative distributions. Usage: build/examples/zipf 1.2 100000000 10000 This will generate 10000 random numbers from a range [0, 100000000) using zipf theta parameter = 1.2. Signed-off-by: Jim Harris Change-Id: I36486399b54f57e771cbc5530ae4905afca60b64 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/7780 Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Shuhei Matsumoto Reviewed-by: Ben Walker --- examples/Makefile | 2 +- examples/util/Makefile | 47 ++++++++++++++++++ examples/util/zipf/Makefile | 42 ++++++++++++++++ examples/util/zipf/zipf.c | 96 +++++++++++++++++++++++++++++++++++++ 4 files changed, 186 insertions(+), 1 deletion(-) create mode 100644 examples/util/Makefile create mode 100644 examples/util/zipf/Makefile create mode 100644 examples/util/zipf/zipf.c diff --git a/examples/Makefile b/examples/Makefile index fa7c0d9b5..098814b1b 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -34,7 +34,7 @@ SPDK_ROOT_DIR := $(abspath $(CURDIR)/..) include $(SPDK_ROOT_DIR)/mk/spdk.common.mk -DIRS-y += accel bdev blob ioat nvme sock vmd nvmf +DIRS-y += accel bdev blob ioat nvme sock vmd nvmf util ifeq ($(OS),Linux) DIRS-$(CONFIG_VHOST) += interrupt_tgt diff --git a/examples/util/Makefile b/examples/util/Makefile new file mode 100644 index 000000000..40ddb1e2c --- /dev/null +++ b/examples/util/Makefile @@ -0,0 +1,47 @@ +# +# BSD LICENSE +# +# Copyright (c) Intel Corporation. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +SPDK_ROOT_DIR := $(abspath $(CURDIR)/../..) +include $(SPDK_ROOT_DIR)/mk/spdk.common.mk + +DIRS-y += zipf + +.PHONY: all clean $(DIRS-y) + +all: $(DIRS-y) + @: + +clean: $(DIRS-y) + @: + +include $(SPDK_ROOT_DIR)/mk/spdk.subdirs.mk diff --git a/examples/util/zipf/Makefile b/examples/util/zipf/Makefile new file mode 100644 index 000000000..66528d9a9 --- /dev/null +++ b/examples/util/zipf/Makefile @@ -0,0 +1,42 @@ +# +# Copyright (c) Intel Corporation. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +SPDK_ROOT_DIR := $(abspath $(CURDIR)/../../..) +include $(SPDK_ROOT_DIR)/mk/spdk.common.mk +include $(SPDK_ROOT_DIR)/mk/spdk.modules.mk + +APP = zipf + +C_SRCS := zipf.c + +SPDK_LIB_LIST = util + +include $(SPDK_ROOT_DIR)/mk/spdk.app.mk diff --git a/examples/util/zipf/zipf.c b/examples/util/zipf/zipf.c new file mode 100644 index 000000000..795cd5054 --- /dev/null +++ b/examples/util/zipf/zipf.c @@ -0,0 +1,96 @@ +/*- + * BSD LICENSE + * + * Copyright (c) Intel Corporation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "spdk/stdinc.h" +#include "spdk/zipf.h" +#include "spdk/histogram_data.h" +#include "spdk/string.h" + +static void +usage(const char *prog) +{ + printf("usage: %s \n", prog); +} + +static void +print_bucket(void *ctx, uint64_t start, uint64_t end, uint64_t count, + uint64_t total, uint64_t so_far) +{ + double so_far_pct; + char range[64]; + + if (count == 0) { + return; + } + + so_far_pct = (double)so_far * 100 / total; + snprintf(range, sizeof(range), "[%ju, %ju)", start, end); + printf("%24s: %9.4f%% (%9ju)\n", range, so_far_pct, count); +} + +int +main(int argc, char **argv) +{ + struct spdk_zipf *zipf; + struct spdk_histogram_data *h; + float theta; + int range, count, i; + + if (argc < 4) { + usage(argv[0]); + return 1; + } + + theta = atof(argv[1]); + range = spdk_strtol(argv[2], 10); + count = spdk_strtol(argv[3], 10); + + if (range <= 0 || count <= 0) { + printf("range and count must be positive integers\n"); + usage(argv[0]); + return 1; + } + + zipf = spdk_zipf_create(range, theta, time(NULL)); + h = spdk_histogram_data_alloc(); + + for (i = 0; i < count; i++) { + spdk_histogram_data_tally(h, spdk_zipf_generate(zipf)); + } + + spdk_histogram_data_iterate(h, print_bucket, NULL); + spdk_histogram_data_free(h); + spdk_zipf_free(&zipf); + + return 0; +}