From aecb6b0ae8c702a93b40b7c01f210a4993eba7ca Mon Sep 17 00:00:00 2001 From: Rodrigo Arias Mallo <rodrigo.arias@bsc.es> Date: Mon, 13 Mar 2023 18:33:08 +0100 Subject: [PATCH 1/7] Add readywave test --- Makefile | 3 +- src/readywave.c | 124 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 src/readywave.c diff --git a/Makefile b/Makefile index 1f0a786..0ce8ec8 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,8 @@ CFLAGS=-O3 -fompss-2 BENCHMARKS=\ sched_get \ sched_add \ - register_deps + register_deps \ + readywave BIN=$(addprefix bench6.,$(BENCHMARKS)) DATA=$(addsuffix .csv, $(addprefix data/,$(BENCHMARKS))) diff --git a/src/readywave.c b/src/readywave.c new file mode 100644 index 0000000..181ef6c --- /dev/null +++ b/src/readywave.c @@ -0,0 +1,124 @@ +/* Copyright (c) 2023 Barcelona Supercomputing Center (BSC) + * SPDX-License-Identifier: GPL-3.0-or-later */ + +#define _DEFAULT_SOURCE + +#include "bench6.h" + +#include <nanos6.h> +#include <nanos6/debug.h> +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include <sys/time.h> + +static int ncpus = -1; +static long nruns = 300L; +static long ntasks_per_cpu = 5000L; +static double taskwork_us = 10.0; + +static double t0; + +#define M_WORK 10000000L + +static void +busywork(long loops) +{ + for (volatile long j = 0; j < loops; j++); +} + +static double +get_time_ms(void) +{ + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (double) ts.tv_sec + (double) ts.tv_nsec * 1.0e-9; +} + +static void +dummy_work(double ms) +{ + double end = get_time_ms() + ms * 1e-3; + while (get_time_ms() < end); +} + +static void +do_run(int run) +{ + /* Warm up all the threads */ + for (long i = 0L; i < ncpus; i++) { + #pragma oss task label("warmup") + dummy_work(20.0); + } + + #pragma oss taskwait + + int flag = 0; + + /* Delay task start so we can create lots of tasks */ + #pragma oss task inout(flag) label("trigger") + { + dummy_work(10.0); + busywork(M_WORK); /* So we can see it in perf */ + t0 = get_time(); + } + + for (long i = 0L; i < ntasks_per_cpu * ncpus; i++) { + #pragma oss task in(flag) label("quickie") + dummy_work(taskwork_us * 1e-3); + } + + /* When trigger finishes all small tasks will become ready */ + #pragma oss taskwait + double t1 = get_time(); + printf("%d,%ld,%d,%.3f,%.3f\n", run, ntasks_per_cpu, ncpus, taskwork_us, (t1 - t0) * 1e3); +} + +static int +usage(char *argv[]) +{ + fprintf(stderr, "Bench6: A set of Nanos6 micro-benchmarks\n"); + fprintf(stderr, "Usage: %s [-r NRUNS] [-t NTASKS_PER_CPU] [-w TASKWORK_US]\n", argv[0]); + fprintf(stderr, "\n"); + fprintf(stderr, +"Creates NTASKS_PER_CPU tasks per CPU that become ready at the\n" +"same time, like a wave. The time between the moment they become\n" +"ready and when the all end is measured. Tasks run for TASKWORK_US\n" +"microseconds. The test is repeated NRUNS times.\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Defaults: NRUNS=%ld NTASKS_PER_CPU=%ld TASKWORK_US=%.3f\n", + nruns, ntasks_per_cpu, taskwork_us); + + return -1; +} + +int +main(int argc, char *argv[]) +{ + int opt; + + while ((opt = getopt(argc, argv, "hr:t:")) != -1) { + switch (opt) { + case 'r': + nruns = atol(optarg); + break; + case 't': + ntasks_per_cpu = atol(optarg); + break; + case 'w': + taskwork_us = atof(optarg); + break; + case 'h': /* Fall through */ + default: /* '?' */ + return usage(argv); + } + } + + ncpus = get_ncpus(); + + printf("%s,%s,%s,%s,%s\n", "run", "ntasks_per_cpu", "ncpus", "taskwork_us", "time_ms"); + for (int run = 0; run < nruns; run++) + do_run(run); + + return 0; +} -- GitLab From 08d67b1a62025edc87e1aa85f387d35f5f0c2f60 Mon Sep 17 00:00:00 2001 From: Rodrigo Arias Mallo <rodrigo.arias@bsc.es> Date: Tue, 14 Mar 2023 10:20:43 +0100 Subject: [PATCH 2/7] Fix -w option --- src/readywave.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/readywave.c b/src/readywave.c index 181ef6c..0706098 100644 --- a/src/readywave.c +++ b/src/readywave.c @@ -97,7 +97,7 @@ main(int argc, char *argv[]) { int opt; - while ((opt = getopt(argc, argv, "hr:t:")) != -1) { + while ((opt = getopt(argc, argv, "hr:t:w:")) != -1) { switch (opt) { case 'r': nruns = atol(optarg); -- GitLab From 6832d0e6276e0ac02e590018398fc61e16d302f5 Mon Sep 17 00:00:00 2001 From: Rodrigo Arias Mallo <rodrigo.arias@bsc.es> Date: Tue, 14 Mar 2023 10:21:01 +0100 Subject: [PATCH 3/7] Use 100 runs by default --- src/readywave.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/readywave.c b/src/readywave.c index 0706098..3aa0fef 100644 --- a/src/readywave.c +++ b/src/readywave.c @@ -13,7 +13,7 @@ #include <sys/time.h> static int ncpus = -1; -static long nruns = 300L; +static long nruns = 100L; static long ntasks_per_cpu = 5000L; static double taskwork_us = 10.0; -- GitLab From 7f2903d404ffd2c14af48554cb94b78814c4c347 Mon Sep 17 00:00:00 2001 From: Rodrigo Arias Mallo <rodrigo.arias@bsc.es> Date: Tue, 14 Mar 2023 10:21:27 +0100 Subject: [PATCH 4/7] Add readywave plot script --- plot/readywave.R | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 plot/readywave.R diff --git a/plot/readywave.R b/plot/readywave.R new file mode 100644 index 0000000..2f937f8 --- /dev/null +++ b/plot/readywave.R @@ -0,0 +1,26 @@ +library(ggplot2) +library(dplyr, warn.conflicts = FALSE) +library(scales) +library(jsonlite) +library(readr) + +# Load the arguments (argv) +args = commandArgs(trailingOnly=TRUE) + +input_file = args[1] + +df = read_delim(input_file, delim=",", show_col_types = FALSE) + +dpi = 96 +h = 2 +w = 6 + +# --------------------------------------------------------------------- + +p = ggplot(df, aes(time_ms)) + + geom_histogram(bins=80) + + theme_bw() + + labs(x = "Time (ms)", title="Nanos6: readywave time") + # TODO: Add ntasks and taskwork to labels + +ggsave(sprintf("%s.png", input_file), plot=p, width=w, height=h, dpi=dpi) -- GitLab From 45b23dceba3e0a54e396c62edd7fc5a5d059cf34 Mon Sep 17 00:00:00 2001 From: Rodrigo Arias Mallo <rodrigo.arias@bsc.es> Date: Tue, 14 Mar 2023 10:22:31 +0100 Subject: [PATCH 5/7] Add shell.nix --- shell.nix | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 shell.nix diff --git a/shell.nix b/shell.nix new file mode 100644 index 0000000..c04b746 --- /dev/null +++ b/shell.nix @@ -0,0 +1,15 @@ +let + pkgs = import (builtins.fetchTarball + "https://pm.bsc.es/gitlab/rarias/bscpkgs/-/archive/master/bscpkgs-master.tar.gz"); + + rWrapper = pkgs.rWrapper.override { + packages = with pkgs.rPackages; [ tidyverse rjson jsonlite egg viridis ]; + }; +in + pkgs.mkShell { + nativeBuildInputs = [ + pkgs.bsc.clangOmpss2 + pkgs.bsc.nanos6 + rWrapper + ]; + } -- GitLab From 0f4db94ea19b9f5fada1c842f624a0489d9fa5f2 Mon Sep 17 00:00:00 2001 From: Rodrigo Arias Mallo <rodrigo.arias@bsc.es> Date: Tue, 14 Mar 2023 10:56:57 +0100 Subject: [PATCH 6/7] Add readywave plot to README --- README.md | 2 ++ examples/readywave-instr.csv.png | Bin 0 -> 20169 bytes 2 files changed, 2 insertions(+) create mode 100644 examples/readywave-instr.csv.png diff --git a/README.md b/README.md index 68e6f47..7ed7f9b 100644 --- a/README.md +++ b/README.md @@ -11,3 +11,5 @@ Examples: <img src="examples/sched_get.csv.png" width="400px"/> <img src="examples/register_deps.csv.png" width="100%"/> + +<img src="examples/readywave-instr.csv.png" width="600px"/> diff --git a/examples/readywave-instr.csv.png b/examples/readywave-instr.csv.png new file mode 100644 index 0000000000000000000000000000000000000000..c6747d395f6957b6773447d07daf1fe2850eb0ee GIT binary patch literal 20169 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 He)r!1h~qj- literal 0 HcmV?d00001 -- GitLab From 88c2434e1338fe7399b2d59c52e43120096fcd71 Mon Sep 17 00:00:00 2001 From: Rodrigo Arias Mallo <rodrigo.arias@bsc.es> Date: Tue, 14 Mar 2023 12:39:49 +0100 Subject: [PATCH 7/7] Remove get_time_ms() and use get_time() --- src/readywave.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/readywave.c b/src/readywave.c index 3aa0fef..bec436c 100644 --- a/src/readywave.c +++ b/src/readywave.c @@ -27,19 +27,11 @@ busywork(long loops) for (volatile long j = 0; j < loops; j++); } -static double -get_time_ms(void) -{ - struct timespec ts; - clock_gettime(CLOCK_MONOTONIC, &ts); - return (double) ts.tv_sec + (double) ts.tv_nsec * 1.0e-9; -} - static void dummy_work(double ms) { - double end = get_time_ms() + ms * 1e-3; - while (get_time_ms() < end); + double end = get_time() + ms * 1e-3; + while (get_time() < end); } static void -- GitLab