From 94babdaadab4c75fb6724120819f09d3d7e88f90 Mon Sep 17 00:00:00 2001 From: Axel Huebl Date: Tue, 23 Jan 2024 09:14:45 -0800 Subject: [PATCH] Doc: Fast, Local Compilation (#4603) * Doc: Fast, Local Compilation Workflows for compiling without or with slow internet access or when working on WarpX and its dependencies at the same time. * Fix Typos Co-authored-by: David Grote Co-authored-by: Luca Fedeli Co-authored-by: Roelof Groenewald <40245517+roelof-groenewald@users.noreply.github.com> * Doc: Rapid Python Dev (no LTO/IPO, no deps) * One more link on `CMAKE_PREFIX_PATH` * CCache Notes * Updates from Dave's Review Comments --------- Co-authored-by: David Grote Co-authored-by: Luca Fedeli Co-authored-by: Roelof Groenewald <40245517+roelof-groenewald@users.noreply.github.com> --- Docs/source/developers/local_compile.rst | 138 +++++++++++++++++++++++ Docs/source/developers/workflows.rst | 1 + Docs/source/install/cmake.rst | 3 + Docs/source/install/dependencies.rst | 5 + 4 files changed, 147 insertions(+) create mode 100644 Docs/source/developers/local_compile.rst diff --git a/Docs/source/developers/local_compile.rst b/Docs/source/developers/local_compile.rst new file mode 100644 index 00000000000..8bfa033a92d --- /dev/null +++ b/Docs/source/developers/local_compile.rst @@ -0,0 +1,138 @@ +.. _developers-local-compile: + +Fast, Local Compilation +======================= + +For simplicity, WarpX :ref:`compilation with CMake ` by default downloads, configures and compiles compatible versions of :ref:`central dependencies ` such as: + +* `AMReX `__ +* `PICSAR `__ +* `openPMD-api `__ +* `pyAMReX `__ +* `pybind11 `__ + +on-the-fly, which is called a *superbuild*. + +In some scenarios, e.g., when compiling without internet, with slow internet access, or when working on WarpX and its dependencies, modifications to the superbuild strategy might be preferable. +In the below workflows, you as the developer need to make sure to use compatible versions of the dependencies you provide. + + +.. _developers-local-compile-src: + +Compiling From Local Sources +---------------------------- + +This workflow is best for developers that make changes to WarpX, AMReX, PICSAR, openPMD-api and/or pyAMReX at the same time. +For instance, use this if you add a feature in AMReX and want to try it in WarpX before it is proposed as a pull request for inclusion in AMReX. + +Instead of downloading the source code of the above dependencies, one can also use an already cloned source copy. +For instance, clone these dependencies to ``$HOME/src``: + +.. code-block:: bash + + cd $HOME/src + + git clone https://github.com/ECP-WarpX/WarpX.git warpx + git clone https://github.com/AMReX-Codes/amrex.git + git clone https://github.com/openPMD/openPMD-api.git + git clone https://github.com/ECP-WarpX/picsar.git + git clone https://github.com/AMReX-Codes/pyamrex.git + git clone https://github.com/pybind/pybind11.git + +Now modify the dependencies as needed in their source locations, update sources if you cloned them earlier, etc. +When building WarpX, :ref:`the following CMake flags ` will use the respective local sources: + +.. code-block:: bash + + cd src/warpx + + rm -rf build + + cmake -S . -B build \ + -DWarpX_PYTHON=ON \ + -DWarpX_amrex_src=$HOME/src/amrex \ + -DWarpX_openpmd_src=$HOME/src/openPMD-api \ + -DWarpX_picsar_src=$HOME/src/picsar \ + -DWarpX_pyamrex_src=$HOME/src/pyamrex \ + -DWarpX_pybind11_src=$HOME/src/pybind11 + + cmake --build build -j 8 + cmake --build build -j 8 --target pip_install + + +.. _developers-local-compile-findpackage: + +Compiling With Pre-Compiled Dependencies +---------------------------------------- + +This workflow is the best and fastest to compile WarpX, when you just want to change code in WarpX and have the above central dependencies already made available *in the right configurations* (e.g., w/ or w/o MPI or GPU support) from a :ref:`module system ` or :ref:`package manager `. + +Instead of downloading the source code of the above central dependencies, or using a local copy of their source, we can compile and install those dependencies once. +By setting the `CMAKE_PREFIX_PATH `__ environment variable to the respective dependency install location prefixes, we can instruct CMake to `find their install locations and configurations `__. + +WarpX supports this with :ref:`the following CMake flags `: + +.. code-block:: bash + + cd src/warpx + + rm -rf build + + cmake -S . -B build \ + -DWarpX_PYTHON=ON \ + -DWarpX_amrex_internal=OFF \ + -DWarpX_openpmd_internal=OFF \ + -DWarpX_picsar_internal=OFF \ + -DWarpX_pyamrex_internal=OFF \ + -DWarpX_pybind11_internal=OFF + + cmake --build build -j 8 + cmake --build build -j 8 --target pip_install + +As a background, this is also the workflow how WarpX is built in :ref:`package managers such as Spack and Conda-Forge `. + + +.. _developers-local-compile-pylto: + +Faster Python Builds +-------------------- + +The Python bindings of WarpX and AMReX (pyAMReX) use `pybind11 `__. +Since pybind11 relies heavily on `C++ metaprogramming `__, speeding up the generated binding code requires that we perform a `link-time optimization (LTO) `__ step, also known as `interprocedural optimization (IPO) `__. + +For fast local development cycles, one can skip LTO/IPO with the following flags: + +.. code-block:: bash + + cd src/warpx + + cmake -S . -B build \ + -DWarpX_PYTHON=ON \ + -DWarpX_PYTHON_IPO=OFF \ + -DpyAMReX_IPO=OFF + + cmake --build build -j 8 --target pip_install + +.. note:: + + We might transition to `nanobind `__ in the future, which `does not rely on LTO/IPO `__ for optimal binaries. + You can contribute to `this pyAMReX pull request `__ to help exploring this library (and if it works for the HPC/GPU compilers that we need to support). + +For robustness, our ``pip_install`` target performs a regular ``wheel`` build and then installs it with ``pip``. +This step will check every time of WarpX dependencies are properly installed, to avoid broken installations. +When developing without internet or after the first ``pip_install`` succeeded in repeated installations in rapid development cycles, this check of ``pip`` can be skipped by using the ``pip_install_nodeps`` target instead: + +.. code-block:: bash + + cmake --build build -j 8 --target pip_install_nodeps + + +.. _developers-local-compile-ccache: + +CCache +------ + +WarpX builds will automatically search for `CCache `__ to speed up subsequent compilations in development cycles. +Make sure a :ref:`recent CCache version ` is installed to make use of this feature. + +For power developers that switch a lot between fundamentally different WarpX configurations (e.g., 1D to 3D, GPU and CPU builds, many branches with different bases, developing AMReX and WarpX at the same time), also consider increasing the `CCache cache size `__ and changing the `cache directory `__ if needed, e.g., due to storage quota constraints or to choose a fast(er) filesystem for the cache files. diff --git a/Docs/source/developers/workflows.rst b/Docs/source/developers/workflows.rst index d56974b4101..8b357f5d4da 100644 --- a/Docs/source/developers/workflows.rst +++ b/Docs/source/developers/workflows.rst @@ -10,3 +10,4 @@ Workflows testing documentation checksum + local_compile diff --git a/Docs/source/install/cmake.rst b/Docs/source/install/cmake.rst index e299a60c75b..d1dc25cf095 100644 --- a/Docs/source/install/cmake.rst +++ b/Docs/source/install/cmake.rst @@ -147,10 +147,12 @@ Relative paths are also supported, e.g. ``-DWarpX_amrex_src=../amrex``. Or build against an AMReX feature branch of a colleague. Assuming your colleague pushed AMReX to ``https://github.com/WeiqunZhang/amrex/`` in a branch ``new-feature`` then pass to ``cmake`` the arguments: ``-DWarpX_amrex_repo=https://github.com/WeiqunZhang/amrex.git -DWarpX_amrex_branch=new-feature``. +More details on this :ref:`workflow are described here `. You can speed up the install further if you pre-install these dependencies, e.g. with a package manager. Set ``-DWarpX__internal=OFF`` and add installation prefix of the dependency to the environment variable `CMAKE_PREFIX_PATH `__. Please see the :ref:`introduction to CMake ` if this sounds new to you. +More details on this :ref:`workflow are described here `. If you re-compile often, consider installing the `Ninja `__ build system. Pass ``-G Ninja`` to the CMake configuration call to speed up parallel compiles. @@ -327,6 +329,7 @@ This is the workflow most developers will prefer as it allows rapid re-compiles: # build & install Python only cmake --build build -j 4 --target pip_install +There is also a ``--target pip_install_nodeps`` option that :ref:`skips pip-based dependency checks `. WarpX release managers might also want to generate a self-contained source package that can be distributed to exotic architectures: diff --git a/Docs/source/install/dependencies.rst b/Docs/source/install/dependencies.rst index a939db840da..94b2be78bec 100644 --- a/Docs/source/install/dependencies.rst +++ b/Docs/source/install/dependencies.rst @@ -12,6 +12,11 @@ Please see installation instructions below. - `AMReX `__: we automatically download and compile a copy of AMReX - `PICSAR `__: we automatically download and compile a copy of PICSAR +and for Python bindings: + +- `pyAMReX `__: we automatically download and compile a copy of pyAMReX +- `pybind11 `__: we automatically download and compile a copy of pybind11 + Optional dependencies include: - `MPI 3.0+ `__: for multi-node and/or multi-GPU execution