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