Building the RAJA Performance Suite¶
This section will help you build the RAJA Performance Suite code so you can start running it.
Requirements¶
The primary requirement for building the RAJA Performance Suite are:
C++ compiler with C++14 support
CMake version 3.23 or greater when building the HIP back-end, and version 3.20 or greater otherwise.
For the most part, available configuration options and how to enable or disable them are similar to RAJA build options.
Later in this section, we discuss options that are specific to the RAJA Performance Suite.
Getting the Code¶
The RAJA Performance Suite code is hosted on the GitHub RAJA Performance Suite project. To get the code, clone the repository into a local working space using the command:
$ git clone --recursive https://github.com/LLNL/RAJAPerf.git
The --recursive option is required to pull all RAJA Performance Suite
Git submodules into your local copy of the repository.
After running the git clone command, a copy of the RAJA Performance Suite
repository will reside in the RAJAPerf subdirectory where you ran the
clone command. You will be on the develop branch, which is the default
RAJA Performance Suite branch. For example:
$ cd RAJAPerf
$ git branch | grep \*
* develop
If you do not pass the --recursive argument to the git clone
command, you can also type the following command in the RAJAPerf
directory after cloning:
$ git submodule update --init --recursive
Either way, the result is the same and you should be good to configure the code and build it.
Note
If you are in your local copy of the RAJA Performance Suite repo and you switch to a different branch (e.g., you run the command
git checkout <different branch name>), you may need to run the commandgit submodule updateto set the Git submodule versions to what is used by the new branch. To see if this is required, thegit statuscommand will indicate whether the submodules are at the proper versions.If the set of submodules in a new branch is different than the previous branch you were on, you may need to run the command
git submodule update --init --recursive(described above) to pull in the correct set of submodule and versions.
Dependencies¶
The RAJA Performance Suite has several required dependencies. These are contained in the Suite Git submodules. So for most usage, we recommend using the submodules which are pinned to specific versions of those libraries in each branch or release.
The most important dependencies are:
RAJA also contains dependencies, which are discussed in RAJA Dependencies.
Build and Install¶
The build and install process for the RAJA Performance Suite is similar to the process for RAJA, which is described in RAJA Build and Install.
When building the RAJA Performance Suite, RAJA and the RAJA Performance Suite are built together using the same CMake configuration. The basic process for generating a build space and configuration is to create a build directory and run CMake in it. For example:
$ pwd
path/to/RAJAPerf
$ mkdir my-build
$ cd my-build
$ cmake <cmake args> ..
$ make -j
For convenience and informational purposes, we maintain scripts in the
scripts directory for various build configurations. These scripts invoke
associated host-config files (CMake cache files) in the RAJA submodule. For
example, the scripts/lc-builds directory contains scripts that we use
during development to generate build configurations for machines
in the Livermore Computing Center at Lawrence Livermore National Laboratory.
These scripts are designed to be run in the top-level RAJAPerf directory. Each
script creates a descriptively-named build space directory and runs CMake with
a configuration appropriate for the platform and specified compiler(s). To
compile the code after CMake completes, enter the build directory and type
make (or make -j <N> or make -j for a parallel build using N
processor cores, or all available processor cores on a node, respectively).
For example:
$ ./scripts/lc-builds/blueos_nvcc_clang.sh 10.2.89 70 10.0.1
$ cd build_blueos_nvcc10.2.89-70-clang10.0.1
$ make -j
will build the code for CPU-GPU execution using the clang 10.0.1 compiler for
the CPU and CUDA 10.2.89 for the GPU. The GPU executable code will target
the CUDA compute architecture sm_70.
Note
The scripts in the scripts/lc-builds directory contain
helpful examples of running CMake to generate a variety of
build configurations.
When no CMake test options are provided, only the RAJA Performance Suite code
will be built. If you want to build both the Suite tests and RAJA tests (to
verify that everything is built properly), pass the following options to
CMake: -DENABLE_TESTS=On and -DRAJA_PERFSUITE_ENABLE_TESTS=On. This
can be done on the command line if you run CMake directly or by editing the
build script you are using. If you want to build the Suite tests, but not
RAJA tests, pass the two CMake options above plus the option
-DRAJA_ENABLE_TESTS=Off. In any case, after the build completes, you can
type make test to run the tests you have built and see the results.
Note
The kernel variants that can be run depends on which programming
model features have been enabled in a build configuration. By
default, only sequential CPU RAJA and baseline variants will be
built. To additionally enable OpenMP variants, for example, you must
pass the DENABLE_OPENMP=On option to CMake. Similar options will
enable other variants for CUDA, HIP, and other programming models.
Note
For GPU-enabled builds, only one GPU back-end can be enabled in a single executable. However, CPU and GPU execution can be enabled in a single executable. For example, one can enable CPU sequential, OpenMP, and CUDA GPU variants in a build. Similarly for HIP GPU variants.
Building with MPI¶
Earlier, we mentioned that the Suite can be built with MPI enabled and described why this is useful. Some configuration scripts we provide will configure a build with MPI support enabled. For example:
$ ./scripts/lc-builds/lc-blueos_spectrum_nvcc_clang.sh rolling-release 10.2.89 70 10.0.1
$ cd build_lc_blueos-spectrumrolling-release-nvcc10.2.89-70-clang10.0.1
$ make -j
This will configure a build to use the rolling release of the Spectrum MPI implementation for an appropriate Livermore Computing system.
In general, MPI support can be enabled by passing the -DENABLE_MPI=On option
to CMake and providing a MPI compiler wrapper via the
-DMPI_CXX_COMPILER=/path/to/mpic++ option to CMake, in addition to other
necessary CMake options. For example:
$ mkdir my-mpi-build
$ cd my-mpi-build
$ cmake <cmake args> \
-DENABLE_MPI=On -DMPI_CXX_COMPILER=/path/to/mpic++ \
..
$ make -j
Building with specific GPU thread-block size tunings¶
If desired, you can build a version of the RAJA Performance Suite code with
multiple versions of GPU kernels that will run with different GPU thread-block
sizes. The CMake option for this is
-DRAJA_PERFSUITE_GPU_BLOCKSIZES=<list,of,block,sizes>. For example:
$ mkdir my-gpu-build
$ cd my-gpu-build
$ cmake <cmake args> \
-DRAJA_PERFSUITE_GPU_BLOCKSIZES=64,128,256,512,1024 \
..
$ make -j
will build versions of GPU kernels that use 64, 128, 256, 512, and 1024 threads per GPU thread-block.
Building with specific GPU atomic replication tunings¶
If desired, you can build a version of the RAJA Performance Suite code with
multiple versions of GPU kernels that will run with different GPU atomic
replication amounts. The CMake option for this is
-DRAJA_PERFSUITE_ATOMIC_REPLICATIONS=<list,of,atomic,replication,amounts>. For example:
$ mkdir my-gpu-build
$ cd my-gpu-build
$ cmake <cmake args> \
-DRAJA_PERFSUITE_ATOMIC_REPLICATIONS=1,256,4096 \
..
$ make -j
will build versions of GPU kernels that use 1, 256, and 4096 atomic replications.
Building with specific GPU items per thread tunings¶
If desired, you can build a version of the RAJA Performance Suite code with
multiple versions of GPU kernels that will run with different GPU items per
thread amounts. The CMake option for this is
-DRAJA_PERFSUITE_GPU_ITEMS_PER_THREAD=<list,of,items,per,thread,amounts>. For example:
$ mkdir my-gpu-build
$ cd my-gpu-build
$ cmake <cmake args> \
-DRAJA_PERFSUITE_GPU_ITEMS_PER_THREAD=1,2,4,8 \
..
$ make -j
will build versions of GPU kernels that use 1, 2, 4, and 8 items per thread.
Building with Caliper¶
RAJAPerf Suite may also use Caliper instrumentation, with per variant & tuning output into .cali files. While Caliper is low-overhead it is not zero, so it will add a small amount of timing skew in its data as compared to the original. Caliper output enables usage of performance analysis tools like Hatchet and Thicket. For much more on Caliper, Hatchet and Thicket, read their documentation here:
Caliper annotation is in the following tree structure:
RAJAPerf
Group
Kernel
1: Use one of the caliper build scripts in scripts/lc-builds/*_caliper.sh
2: Add the build options manually to an existing build:
In Cmake scripts add
**-DRAJA_PERFSUITE_USE_CALIPER=On**
Add to **-DCMAKE_PREFIX_PATH**
;${CALIPER_PREFIX}/share/cmake/caliper;${ADIAK_PREFIX}/lib/cmake/adiak
or use
-Dcaliper_DIR -Dadiak_DIR package prefixes
For Spack : raja_perf +caliper ^caliper@2.9.0
For Uberenv: python3 scripts/uberenv/uberenv.py –spec +caliper ^caliper@2.9.0
If you intend on passing nvtx or roctx annotation to Nvidia or AMD profiling tools, build Caliper with +cuda cuda_arch=XX or +rocm respectively. Then you can specify an additional Caliper service for nvtx or roctx like so: roctx example:
CALI_SERVICES_ENABLE=roctx rocprof –roctx-trace –hip-trace raja-perf.exe