Add readywave test
This commit is contained in:
parent
0eed8e22fb
commit
aecb6b0ae8
3
Makefile
3
Makefile
@ -4,7 +4,8 @@ CFLAGS=-O3 -fompss-2
|
|||||||
BENCHMARKS=\
|
BENCHMARKS=\
|
||||||
sched_get \
|
sched_get \
|
||||||
sched_add \
|
sched_add \
|
||||||
register_deps
|
register_deps \
|
||||||
|
readywave
|
||||||
|
|
||||||
BIN=$(addprefix bench6.,$(BENCHMARKS))
|
BIN=$(addprefix bench6.,$(BENCHMARKS))
|
||||||
DATA=$(addsuffix .csv, $(addprefix data/,$(BENCHMARKS)))
|
DATA=$(addsuffix .csv, $(addprefix data/,$(BENCHMARKS)))
|
||||||
|
124
src/readywave.c
Normal file
124
src/readywave.c
Normal file
@ -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;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user