Building hpic2 on the Illinois Campus Cluster (ICC) =================================================== The Illinois Campus Cluster (`ICC `_) is a high-performance computing (HPC) cluster that is available to the students, faculty, and staff at the University of Illinois at Urbana-Champaign. The ICC is managed by the `National Center for Supercomputing Applications (NCSA) `_. Full documentation for the ICC is available at the following link, `ICC Documentation `_. The ICC is a shared resource, and users are expected to abide by the `ICC User Policy `_. Step 1: Get an account on the ICC --------------------------------- If you do not already have an account on the Illinois Campus Cluster, request access for Research here, * `ICC Request Access for Research `_ specifying to be added to the following group: ``dcurreli-npre-eng`` Read the ICC `resources `_\ , such as: * `ICC Getting started `_ * `ICC User Guide `_ * `ICC Access `_ * `ICC Running Jobs `_ * `ICC Storage and Data Guide `_ * `ICC Training and Tutorials `_ Step 2: Connect to the ICC -------------------------- The Campus Cluster can be accessed via Secure Shell (SSH) to the head nodes using your official University NetID login and password: .. code-block:: bash ssh @cc-login.campuscluster.illinois.edu Step 3: Check your login environment ------------------------------------ Once you login to the ICC, you normally land on a folder named after your NetID. .. code-block:: bash $ echo $HOME /home/ The login environment is set up to provide a minimal set of tools and libraries. The necessary modules have to be loaded to use the software. To see what is available: .. code-block:: bash module avail Step 4: Load the necessary modules ---------------------------------- In order to build hPIC2, you need to load the necessary modules. The past few versions of hPIC2 and its dependencies are available as modules. The most recent version is also marked as ``latest``. These are provided in a shared folder of the campus cluster. To see them, you need to use the `module use` command: .. code-block:: bash module use /scratch/users/logantm2/share/modulefiles (It is recommended to add this line to your ``.bashrc`` file.) Now the list of available modules should include also the hPIC2 dependencies in the form ``hpic2deps//``, where ```` refers to the date when the module was generated. To see the list of available configurations, type: .. code-block:: bash module avail The output should now have a block that looks like this: .. code-block:: bash ------------------ /scratch/users/logantm2/share/modulefiles ------------------- cmake hpic2/+openmp-cuda-arch-70/2023-12-05 hpic2/+openmp-cuda-arch-70/latest hpic2/+openmp-cuda-arch-86/2023-12-05 hpic2/+openmp-cuda-arch-86/latest hpic2/+openmp-cuda-arch-None/2023-12-05 hpic2/+openmp-cuda-arch-None/latest hpic2/~openmp-cuda-arch-70/2023-12-05 hpic2/~openmp-cuda-arch-70/latest hpic2/~openmp-cuda-arch-86/2023-12-05 hpic2/~openmp-cuda-arch-86/latest hpic2/~openmp-cuda-arch-None/2023-12-05 hpic2/~openmp-cuda-arch-None/latest hpic2deps/+openmp-cuda-arch-70/Debug/2023-12-05 hpic2deps/+openmp-cuda-arch-70/Debug/latest hpic2deps/+openmp-cuda-arch-70/Release/2023-12-05 hpic2deps/+openmp-cuda-arch-70/Release/latest hpic2deps/+openmp-cuda-arch-86/Debug/2023-12-05 hpic2deps/+openmp-cuda-arch-86/Debug/latest hpic2deps/+openmp-cuda-arch-86/Release/2023-12-05 hpic2deps/+openmp-cuda-arch-86/Release/latest hpic2deps/+openmp-cuda-arch-None/Debug/2023-12-05 hpic2deps/+openmp-cuda-arch-None/Debug/latest hpic2deps/+openmp-cuda-arch-None/Release/2023-12-05 hpic2deps/+openmp-cuda-arch-None/Release/latest hpic2deps/~openmp-cuda-arch-70/Debug/2023-12-05 hpic2deps/~openmp-cuda-arch-70/Debug/latest hpic2deps/~openmp-cuda-arch-70/Release/2023-12-05 hpic2deps/~openmp-cuda-arch-70/Release/latest hpic2deps/~openmp-cuda-arch-86/Debug/2023-12-05 hpic2deps/~openmp-cuda-arch-86/Debug/latest hpic2deps/~openmp-cuda-arch-86/Release/2023-12-05 hpic2deps/~openmp-cuda-arch-86/Release/latest hpic2deps/~openmp-cuda-arch-None/Debug/2023-12-05 hpic2deps/~openmp-cuda-arch-None/Debug/latest hpic2deps/~openmp-cuda-arch-None/Release/2023-12-05 hpic2deps/~openmp-cuda-arch-None/Release/latest The configuration specifies whether OpenMP is enabled (``+openmp`` for enabled and ``~openmp`` for disabled), whether CUDA is enabled and the Compute Capability (CC) of the target NVIDIA GPU (``cuda-arch-70`` for CC 7.0, ``cuda-arch-86`` for CC 8.6, and ``cuda-arch-None`` for no CUDA), and whether the dependencies are for a debug or release build (``Debug`` for debug and ``Release`` for release). Now you can load the desired modules, for example: .. code-block:: bash module purge module load hpic2deps/+openmp-cuda-arch-None/Release/latest will load the latest version of the hPIC2 dependencies in release mode, with OpenMP but without CUDA. A ``module list`` command should now show the loaded modules, for example: .. code-block:: bash Currently Loaded Modulefiles: 1) gcc/8.2.0 2) openmpi/4.1.4-gcc-8.2.0 3) cmake 4) anaconda/3 5) hpic2deps/+openmp-cuda-arch-None/Release/latest Which modules to load? ^^^^^^^^^^^^^^^^^^^^^^ In order to fully utilize the hybrid parallelism of hpic2 on the ICC, you need to load modules including either OpenMP or CUDA. For example, to use the OpenMP backend, you can load the module ``hpic2deps/+openmp-cuda-arch-None/Release/latest``. For a debug build, you can load a module including ``Debug``, such as ``hpic2deps/+openmp-cuda-arch-None/Debug/latest``. A little bit more work is required to use CUDA. There are two main GPU types on the cluster: V100s and A10s. The V100s have Compute Capability (CC) 7.0, whereas the A10s have CC 8.6. You must load the module corresponding to the nodes you intend to run on. For example, to run on the V100 nodes, you can load the module ``hpic2deps/+openmp-cuda-arch-70/Release/latest``. How to load the modules automatically? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ You can add the following lines to your ``.bashrc`` file: .. code-block:: bash module use /scratch/users/logantm2/share/modulefiles module purge module load hpic2deps/+openmp-cuda-arch-None/Release/latest Step 5: Clone the hpic2 repository ---------------------------------- Clone the hpic2 repository to your home directory: .. code-block:: bash cd $HOME git clone --recurse-submodules https://github.com/lcpp-org/hpic2.git Step 6: Make a build directory ------------------------------ Make a build directory for hpic2: .. code-block:: bash cd $HOME mkdir hpic2-build Step 7: Configure hpic2 ----------------------- Move to the build directory and configure hpic2: .. code-block:: bash cd $HOME/hpic2-build cmake $HOME/hpic2 -DWITH_RUSTBCA=ON -DWITH_PUMIMBBL=ON Example of expected output: .. code-block:: bash -- The C compiler identification is GNU 8.2.0 -- The CXX compiler identification is GNU 8.2.0 -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working C compiler: /usr/local/gcc/8.2.0/bin/gcc - skipped -- Detecting C compile features -- Detecting C compile features - done -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Check for working CXX compiler: /usr/local/gcc/8.2.0/bin/c++ - skipped -- Detecting CXX compile features -- Detecting CXX compile features - done -- Enabled Kokkos devices: OPENMP;SERIAL -- Found MPI_C: /usr/local/mpi/openmpi/4.1.4/gcc/8.2.0/lib/libmpi.so (found version "3.1") -- Found MPI_CXX: /usr/local/mpi/openmpi/4.1.4/gcc/8.2.0/lib/libmpi.so (found version "3.1") -- Found MPI: TRUE (found version "3.1") -- Performing Test CMAKE_HAVE_LIBC_PTHREAD -- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed -- Looking for pthread_create in pthreads -- Looking for pthread_create in pthreads - not found -- Looking for pthread_create in pthread -- Looking for pthread_create in pthread - found -- Found Threads: TRUE -- Found Hypre: /home/logantm2/share/spack/opt/spack/linux-rhel7-sandybridge/gcc-8.2.0/hypre-2.28.0-6kog5ghteysufv4tept7iw3axzhqbld5/lib/libHYPRE.so -- Found HDF5: hdf5_cpp-shared (found version "1.14.1") found components: CXX -- Configuring done (2.4s) -- Generating done (0.0s) -- Build files have been written to: /home/logantm2/hpic2_openmp_release Step 8: Compile hpic2 --------------------- Compile hpic2 from the build directory: .. code-block:: bash cd $HOME/hpic2-build make -j4 This will compile hpic2 using 4 cores and produce the ``hpic2`` executable in the ``$HOME/hpic2-build`` folder. You can change the number of cores to use by changing the number after the ``-j`` flag. Step 9: Check the executable ---------------------------- Check that the executable is present in the ``$HOME/hpic2-build`` folder: .. code-block:: bash ls $HOME/hpic2-build If the executable is present, you can check it runs correctly simply as follows: .. code-block:: bash $ ./hpic2 hpic2: a Hybrid Particle-in-Cell code. Developed at Laboratory of Computational Plasma Physics, University of Illinois at Urbana-Champaign. usage: ./hpic2 -i|--input-deck INPUT_DECK [options] options: --override-input-warnings: ignore all warnings related to unrecognized fields found in the input deck. If present, this flag disables the required user acknowledgement of input warnings, and the simulation will be launched despite them. For full documentation, see: https://github.com/lcpp-org/hpic2 Acknowledgements ---------------- To cite the ICC in your publications, use the following `acknowledgement statement `_\ : "This work made use of the Illinois Campus Cluster, a computing resource that is operated by the Illinois Campus Cluster Program (ICCP) in conjunction with the National Center for Supercomputing Applications (NCSA) and which is supported by funds from the University of Illinois at Urbana-Champaign."