summaryrefslogtreecommitdiff
path: root/RED
diff options
context:
space:
mode:
authorDaniel Friesel <daniel.friesel@uos.de>2023-05-24 13:41:52 +0200
committerDaniel Friesel <daniel.friesel@uos.de>2023-05-24 13:41:52 +0200
commitf27c88aedeba2fe4927645ef916e3f60d8fb939b (patch)
tree84e2c0f0fa8cc0f874a2f36471195f1bc4ea8983 /RED
parent97ba6163d9609df945d6b2bd5ef9b3537f3f56ba (diff)
RED baseline: add dfatool support
Diffstat (limited to 'RED')
-rw-r--r--RED/baselines/cpu/Makefile2
-rw-r--r--RED/baselines/cpu/app_baseline.cpp67
-rwxr-xr-xRED/baselines/cpu/run.sh17
-rwxr-xr-xRED/support/timer.h7
4 files changed, 68 insertions, 25 deletions
diff --git a/RED/baselines/cpu/Makefile b/RED/baselines/cpu/Makefile
index 154c620..e4d935c 100644
--- a/RED/baselines/cpu/Makefile
+++ b/RED/baselines/cpu/Makefile
@@ -1,5 +1,5 @@
all:
- g++ -O2 app_baseline.cpp -fopenmp -DTHRUST_HOST_SYSTEM=THRUST_HOST_SYSTEM_CPP -DTHRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_OMP -lgomp -I/usr/local/cuda-8.0/include -lm -o red -D${TYPE}
+ g++ -O2 app_baseline.cpp -fopenmp -DTHRUST_HOST_SYSTEM=THRUST_HOST_SYSTEM_CPP -DTHRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_OMP -lgomp -lm -o red -D${TYPE}
clean:
rm red
diff --git a/RED/baselines/cpu/app_baseline.cpp b/RED/baselines/cpu/app_baseline.cpp
index af897f5..11c1cd8 100644
--- a/RED/baselines/cpu/app_baseline.cpp
+++ b/RED/baselines/cpu/app_baseline.cpp
@@ -34,6 +34,9 @@
#include "../../support/common.h"
#include "../../support/timer.h"
+#define XSTR(x) STR(x)
+#define STR(x) #x
+
#define ANSI_COLOR_RED "\x1b[31m"
#define ANSI_COLOR_GREEN "\x1b[32m"
#define ANSI_COLOR_RESET "\x1b[0m"
@@ -72,7 +75,6 @@ typedef struct Params {
unsigned int input_size;
int n_warmup;
int n_reps;
- int exp;
int n_threads;
}Params;
@@ -84,7 +86,6 @@ void usage() {
"\n -h help"
"\n -w <W> # of untimed warmup iterations (default=1)"
"\n -e <E> # of timed repetition iterations (default=3)"
- "\n -x <X> Weak (0) or strong (1) scaling (default=0)"
"\n -t <T> # of threads (default=8)"
"\n"
"\nBenchmark-specific options:"
@@ -97,11 +98,10 @@ struct Params input_params(int argc, char **argv) {
p.input_size = 2 << 20;
p.n_warmup = 1;
p.n_reps = 3;
- p.exp = 0;
p.n_threads = 1;
int opt;
- while((opt = getopt(argc, argv, "hi:w:e:x:t:")) >= 0) {
+ while((opt = getopt(argc, argv, "hi:w:e:t:")) >= 0) {
switch(opt) {
case 'h':
usage();
@@ -110,7 +110,6 @@ struct Params input_params(int argc, char **argv) {
case 'i': p.input_size = atoi(optarg); break;
case 'w': p.n_warmup = atoi(optarg); break;
case 'e': p.n_reps = atoi(optarg); break;
- case 'x': p.exp = atoi(optarg); break;
case 't': p.n_threads = atoi(optarg); break;
default:
fprintf(stderr, "\nUnrecognized option!\n");
@@ -133,7 +132,7 @@ int main(int argc, char **argv) {
unsigned int nr_of_dpus = 1;
unsigned int i = 0;
- const unsigned int input_size = p.exp == 0 ? p.input_size * nr_of_dpus : p.input_size;
+ const unsigned int input_size = p.input_size;
assert(input_size % (p.n_threads) == 0 && "Input size!");
// Input/output allocation
@@ -160,7 +159,7 @@ int main(int argc, char **argv) {
// Compute output on CPU (performance comparison and verification purposes)
if(rep >= p.n_warmup)
- start(&timer, 0, rep - p.n_warmup);
+ start(&timer, 0, 0);
count_host = reduction_host(A, input_size);
if(rep >= p.n_warmup)
stop(&timer, 0);
@@ -170,32 +169,52 @@ int main(int argc, char **argv) {
omp_set_num_threads(p.n_threads);
+ unsigned int nr_threads = 0;
+#pragma omp parallel
+#pragma omp atomic
+ nr_threads++;
+
if(rep >= p.n_warmup)
- start(&timer, 1, rep - p.n_warmup);
+ start(&timer, 1, 0);
count = thrust::reduce(thrust::omp::par, d_input.begin(), d_input.end());
if(rep >= p.n_warmup)
stop(&timer, 1);
h_output = d_input;
+ // Check output
+ bool status = true;
+ if(count_host != count){
+ status = false;
+ printf("%lu -- %lu\n", count, count_host);
+ }
+ if (status) {
+ printf("[" ANSI_COLOR_GREEN "OK" ANSI_COLOR_RESET "] Outputs are equal\n");
+ if(rep >= p.n_warmup) {
+ printf("[::] n_threads=%d e_type=%s n_elements=%d "
+ "| throughput_cpu_ref_MBps=%f throughput_cpu_thrust_MBps=%f\n",
+ nr_threads, XSTR(T), input_size,
+ input_size * sizeof(T) / timer.time[0],
+ input_size * sizeof(T) / timer.time[1]);
+ printf("[::] n_threads=%d e_type=%s n_elements=%d "
+ "| throughput_cpu_ref_MOpps=%f throughput_cpu_thrust_MOpps=%f\n",
+ nr_threads, XSTR(T), input_size,
+ input_size / timer.time[0],
+ input_size / timer.time[1]);
+ printf("[::] n_threads=%d e_type=%s n_elements=%d | ",
+ nr_threads, XSTR(T), input_size);
+ printall(&timer, 1);
+ }
+ } else {
+ printf("[" ANSI_COLOR_RED "ERROR" ANSI_COLOR_RESET "] Outputs differ!\n");
+ }
}
// Print timing results
- printf("CPU ");
- print(&timer, 0, p.n_reps);
- printf("Kernel ");
- print(&timer, 1, p.n_reps);
-
- // Check output
- bool status = true;
- if(count_host != count){
- status = false;
- printf("%lu -- %lu\n", count, count_host);
- }
- if (status) {
- printf("[" ANSI_COLOR_GREEN "OK" ANSI_COLOR_RESET "] Outputs are equal\n");
- } else {
- printf("[" ANSI_COLOR_RED "ERROR" ANSI_COLOR_RESET "] Outputs differ!\n");
- }
+ //printf("CPU ");
+ //print(&timer, 0, p.n_reps);
+ //printf("Kernel ");
+ //print(&timer, 1, p.n_reps);
+
// Deallocation
free(A);
diff --git a/RED/baselines/cpu/run.sh b/RED/baselines/cpu/run.sh
new file mode 100755
index 0000000..82bf983
--- /dev/null
+++ b/RED/baselines/cpu/run.sh
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+set -e
+
+echo "prim-benchmarks RED CPU/Thrust (dfatool edition)"
+echo "Started at $(date)"
+echo "Revision $(git describe --always)"
+
+for nr_threads in 1 2 4 6 8 12 16 20 24 32; do
+ for i in 2048 4096 8192 16384 65536 262144 1048576 3932160 15728640 31457280 262144000 1048576000 2097152000; do
+ for dt in UINT32 UINT64 INT32 INT64 FLOAT DOUBLE; do
+ if make -B TYPE=${dt}; then
+ ./red -i ${i} -w 0 -e 100 -t ${nr_threads} || true
+ fi
+ done
+ done
+done
diff --git a/RED/support/timer.h b/RED/support/timer.h
index eedc385..5c00213 100755
--- a/RED/support/timer.h
+++ b/RED/support/timer.h
@@ -57,3 +57,10 @@ void stop(Timer *timer, int i) {
}
void print(Timer *timer, int i, int REP) { printf("Time (ms): %f\t", timer->time[i] / (1000 * REP)); }
+
+void printall(Timer *timer, int maxt) {
+ for (int i = 0; i <= maxt; i++) {
+ printf(" timer%d_us=%f", i, timer->time[i]);
+ }
+ printf("\n");
+}