Skip to content

Commit 90e025f

Browse files
august-knoxaugust-knoxRiyaz Haquerfhaque
authored
Adding BabelSTREAM experiment class (#526)
* initial commit for babelstream * initial commit for babelstream * adding dryrun * lint * fix license * lint and typos * more lint * lint * dryruns for tioga and lassen * enabling openmp by default * lint and dryrun updates * better fix for openmp * lint * more lint * final lint * changing openmp variant default to false * Update run.yml --------- Co-authored-by: august-knox <[email protected]> Co-authored-by: Riyaz Haque <[email protected]> Co-authored-by: Riyaz Haque <[email protected]>
1 parent 149830b commit 90e025f

File tree

4 files changed

+646
-5
lines changed

4 files changed

+646
-5
lines changed

.github/workflows/run.yml

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -661,6 +661,18 @@ jobs:
661661
--disable-logger \
662662
workspace setup --dry-run
663663
664+
- name: Dry run dynamic genesis/openmp with dynamic fugaku
665+
run: |
666+
system_id=$(./bin/benchpark system id ./fugaku-system)
667+
./bin/benchpark experiment init --dest=genesis-openmp-fugaku genesis+openmp
668+
./bin/benchpark setup ./genesis-openmp-fugaku ./fugaku-system workspace/
669+
. workspace/setup.sh
670+
ramble \
671+
--workspace-dir workspace/genesis-openmp-fugaku/$system_id/workspace \
672+
--disable-progress-bar \
673+
--disable-logger \
674+
workspace setup --dry-run
675+
664676
- name: Dry run dynamic genesis/openmp with dynamic CTS ruby
665677
run: |
666678
system_id=$(./bin/benchpark system id ./ruby-system)
@@ -673,14 +685,38 @@ jobs:
673685
--disable-logger \
674686
workspace setup --dry-run
675687
676-
- name: Dry run dynamic genesis/openmp with dynamic fugaku
688+
- name: Dry run dynamic babelstream/openmp with dynamic CTS tioga
677689
run: |
678-
system_id=$(./bin/benchpark system id ./fugaku-system)
679-
./bin/benchpark experiment init --dest=genesis-openmp-fugaku genesis+openmp
680-
./bin/benchpark setup ./genesis-openmp-fugaku ./fugaku-system workspace/
690+
./bin/benchpark experiment init --dest=babelstream-tioga babelstream +openmp
691+
./bin/benchpark setup ./babelstream-tioga ./tioga-system workspace/
692+
system_id=$(./bin/benchpark system id ./tioga-system)
681693
. workspace/setup.sh
682694
ramble \
683-
--workspace-dir workspace/genesis-openmp-fugaku/$system_id/workspace \
695+
--workspace-dir "workspace/babelstream-tioga/$system_id/workspace" \
696+
--disable-progress-bar \
697+
--disable-logger \
698+
workspace setup --dry-run
699+
700+
- name: Dry run dynamic babelstream/openmp with dynamic CTS sierra
701+
run: |
702+
./bin/benchpark experiment init --dest=babelstream-sierra babelstream +openmp
703+
./bin/benchpark setup ./babelstream-sierra ./sierra-system1 workspace/
704+
system_id=$(./bin/benchpark system id ./sierra-system1)
705+
. workspace/setup.sh
706+
ramble \
707+
--workspace-dir "workspace/babelstream-sierra/$system_id/workspace" \
708+
--disable-progress-bar \
709+
--disable-logger \
710+
workspace setup --dry-run
711+
712+
- name: Dry run dynamic babelstream/openmp with dynamic CTS ruby
713+
run: |
714+
./bin/benchpark experiment init --dest=babelstream babelstream +openmp
715+
./bin/benchpark setup ./babelstream ./ruby-system workspace/
716+
system_id=$(./bin/benchpark system id ./ruby-system)
717+
. workspace/setup.sh
718+
ramble \
719+
--workspace-dir "workspace/babelstream/$system_id/workspace" \
684720
--disable-progress-bar \
685721
--disable-logger \
686722
workspace setup --dry-run

experiments/babelstream/experiment.py

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
# Copyright 2023 Lawrence Livermore National Security, LLC and other
2+
# Benchpark Project Developers. See the top-level COPYRIGHT file for details.
3+
#
4+
# SPDX-License-Identifier: Apache-2.0
5+
6+
from benchpark.directives import variant
7+
from benchpark.experiment import Experiment
8+
from benchpark.expr.builtin.caliper import Caliper
9+
from benchpark.cuda import CudaExperiment
10+
from benchpark.rocm import ROCmExperiment
11+
from benchpark.openmp import OpenMPExperiment
12+
13+
14+
class Babelstream(
15+
Experiment,
16+
Caliper,
17+
CudaExperiment,
18+
ROCmExperiment,
19+
OpenMPExperiment,
20+
):
21+
variant(
22+
"workload",
23+
default="babelstream",
24+
description="babelstream",
25+
)
26+
27+
variant(
28+
"version",
29+
default="caliper",
30+
values=("4.0", "develop", "caliper"),
31+
description="app version",
32+
)
33+
34+
def compute_applications_section(self):
35+
36+
self.add_experiment_variable("processes_per_node", "1", True)
37+
self.add_experiment_variable("n", "35", False)
38+
self.add_experiment_variable("o", "0", False)
39+
n_resources = 1
40+
41+
if self.spec.satisfies("+cuda"):
42+
self.add_experiment_variable("execute", "cuda-stream", False)
43+
44+
elif self.spec.satisfies("+rocm"):
45+
self.add_experiment_variable("execute", "hip-stream", False)
46+
47+
else:
48+
self.add_experiment_variable("n_ranks", n_resources, True)
49+
self.add_experiment_variable("execute", "omp-stream", False)
50+
51+
if self.spec.satisfies("+cuda") or self.spec.satisfies("+rocm"):
52+
self.add_experiment_variable("n_gpus", n_resources, True)
53+
54+
def compute_spack_section(self):
55+
# get package version
56+
app_version = self.spec.variants["version"][0]
57+
58+
# get system config options
59+
# TODO: Get compiler/mpi/package handles directly from system.py
60+
system_specs = {}
61+
system_specs["compiler"] = "default-compiler"
62+
system_specs["mpi"] = "default-mpi"
63+
if self.spec.satisfies("+cuda"):
64+
system_specs["cuda_version"] = "{default_cuda_version}"
65+
system_specs["cuda_arch"] = "{cuda_arch}"
66+
if self.spec.satisfies("+rocm"):
67+
system_specs["rocm_arch"] = "{rocm_arch}"
68+
69+
# set package spack specs
70+
self.add_spack_spec(system_specs["mpi"])
71+
self.add_spack_spec(
72+
self.name, [f"babelstream@{app_version}", system_specs["compiler"]]
73+
)

repo/babelstream/application.py

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
# Copyright 2023 Lawrence Livermore National Security, LLC and other
2+
# Benchpark Project Developers. See the top-level COPYRIGHT file for details.
3+
#
4+
# SPDX-License-Identifier: Apache-2.0
5+
6+
import sys
7+
8+
from ramble.appkit import *
9+
from ramble.expander import Expander
10+
11+
class Babelstream(ExecutableApplication):
12+
"""Babelstream benchmark"""
13+
name = "babelstream"
14+
15+
tags('memorybenchmark', 'microbenchmark', 'memory-benchmark', 'micro-benchmark')
16+
17+
tags = ['synthetic',
18+
'large-scale','multi-node','single-node','sub-node',
19+
'high-memory-bandwidth','regular-memory-access',
20+
'mpi','c','fortran','openmp']
21+
22+
23+
executable('execute', '{execute} -n {n} -s {s}', use_mpi=True)
24+
25+
workload('babelstream', executable='execute')
26+
27+
workload_variable('execute', default='openmp-stream', description='executable to run', workloads=['babelstream'])
28+
workload_variable('n', default='10', description='NTIMES', workloads=['babelstream'])
29+
workload_variable('s', default='10240000', description='STREAM_ARRAY_SIZE', workloads=['babelstream'])
30+
31+
log_file = os.path.join(Expander.expansion_str('experiment_run_dir'),
32+
Expander.expansion_str('experiment_name') + '.out')
33+
34+
35+
figure_of_merit("Array size",
36+
log_file=log_file,
37+
fom_regex=r'Array size\s+\:\s+(?P<array_size>[0-9]+)',
38+
group_name='array_size',
39+
units='elements')
40+
41+
figure_of_merit("Array memory",
42+
log_file=log_file,
43+
fom_regex=r'Memory per array\s+\=\s+(?P<array_mem>[0-9]+)\.*[0-9]*',
44+
group_name='array_mem',
45+
units='MiB')
46+
47+
figure_of_merit("Total memory",
48+
log_file=log_file,
49+
fom_regex=r'Total memory required\s+\=\s+(?P<total_mem>[0-9]+\.*[0-9]*)',
50+
group_name='total_mem',
51+
units='MiB')
52+
53+
figure_of_merit("Number of iterations per thread",
54+
log_file=log_file,
55+
fom_regex=r'Each kernel will be executed\s+(?P<n_times>[0-9]+)',
56+
group_name='n_times',
57+
units='')
58+
59+
figure_of_merit("Number of threads",
60+
log_file=log_file,
61+
fom_regex=r'Number of Threads counted\s+\=\s+(?P<n_threads>[0-9]+\.*[0-9]*)',
62+
group_name='n_threads',
63+
units='')
64+
65+
for opName in ['Copy', 'Mul', 'Add', 'Triad', 'Dot']:
66+
67+
opname = opName.lower()
68+
69+
opregex = (opName + r'\s*' +
70+
r'\s+(?P<' + opname + r'_top_rate>[0-9]+\.[0-9]*)' +
71+
r'\s+(?P<' + opname + r'_min_time>[0-9]+\.[0-9]*)' +
72+
r'\s+(?P<' + opname + r'_max_time>[0-9]+\.[0-9]*)' +
73+
r'\s+(?P<' + opname + r'_avg_time>[0-9]+\.[0-9]*)')
74+
75+
figure_of_merit(opName + ' top rate',
76+
log_file=log_file,
77+
fom_regex=opregex,
78+
group_name=(opname + '_top_rate'),
79+
units='MB/s')
80+
81+
figure_of_merit(opName + ' min time',
82+
log_file=log_file,
83+
fom_regex=opregex,
84+
group_name=(opname + '_min_time'),
85+
units='s')
86+
87+
figure_of_merit(opName + ' max time',
88+
log_file=log_file,
89+
fom_regex=opregex,
90+
group_name=(opname + '_max_time'),
91+
units='s')
92+
93+
figure_of_merit(opName + ' average time',
94+
log_file=log_file,
95+
fom_regex=opregex,
96+
group_name=(opname + '_avg_time'),
97+
units='s')

0 commit comments

Comments
 (0)