diff options
Diffstat (limited to 'lib/spack/docs/build_systems/intelpackage.rst')
-rw-r--r-- | lib/spack/docs/build_systems/intelpackage.rst | 1054 |
1 files changed, 1048 insertions, 6 deletions
diff --git a/lib/spack/docs/build_systems/intelpackage.rst b/lib/spack/docs/build_systems/intelpackage.rst index a21a0beb32..c03bbc30e0 100644 --- a/lib/spack/docs/build_systems/intelpackage.rst +++ b/lib/spack/docs/build_systems/intelpackage.rst @@ -4,10 +4,1052 @@ IntelPackage ------------ -Intel provides many licensed software packages, which all share the -same basic steps for configuring and installing, as well as license -management. +.. contents:: -This build system is a work-in-progress. See -https://github.com/spack/spack/pull/4300 and -https://github.com/spack/spack/pull/7469 for more information. +^^^^^^^^^^^^^^^^^^^^^^^^ +Intel packages in Spack +^^^^^^^^^^^^^^^^^^^^^^^^ + +Spack can install and use several software development products offered by Intel. +Some of these are available under no-cost terms, others require a paid license. +All share the same basic steps for configuration, installation, and, where +applicable, license management. The Spack Python class ``IntelPackage`` implements +these steps. + +Spack interacts with Intel tools in several routes, like it does for any +other package: + +.. _`route 1`: + +1. Accept system-provided tools after you declare them to Spack as *external packages*. + +.. _`route 2`: + +2. Install the products for you as *internal packages* in Spack. + +.. _`route 3`: + +3. *Use* the packages, regardless of installation route, to install what we'll + call *client packages* for you, this being Spack's primary purpose. + +An auxiliary route follows from route 2, as it would for most Spack +packages, namely: + +.. _`route 4`: + +4. Make Spack-installed Intel tools available outside of Spack for ad-hoc use, + typically through Spack-managed modulefiles. + +This document covers routes 1 through 3. + + +"""""""""""""""""""""""""""""""""" +Packages under no-cost license +"""""""""""""""""""""""""""""""""" + +Intel's standalone performance library products, notably MKL and MPI, are +available for use under a `simplified license +<https://software.intel.com/en-us/license/intel-simplified-software-license>`_ +since 2017 [fn1]_. They are packaged in Spack as: + +* ``intel-mkl`` -- Math Kernel Library (linear algebra and FFT), +* ``intel-mpi`` -- The Intel-MPI implementation (derived from MPICH), +* ``intel-ipp`` -- Primitives for image-, signal-, and data-processing, +* ``intel-daal`` -- Machine learning and data analytics. + +Some earlier versions of these libraries were released under a paid license. +For these older versions, the license must be available at installation time of +the products and during compilation of client packages. + +The library packages work well with the Intel compilers but do not require them +-- those packages can just as well be used with other compilers. The Intel +compiler invocation commands offer custom options to simplify linking Intel +libraries (sometimes considerably), but Spack always uses fairly explicit +linkage anyway. + + +"""""""""""""""""" +Licensed packages +"""""""""""""""""" + +Intel's core software development products that provide compilers, analyzers, +and optimizers do require a paid license. In Spack, they are packaged as: + +* ``intel-parallel-studio`` -- the entire suite of compilers and libraries, +* ``intel`` -- a subset containing just the compilers and the Intel-MPI runtime [fn2]_. + +.. + TODO: Confirm and possible change(!) the scope of MPI components (runtime + vs. devel) in current (and previous?) *cluster/professional/composer* + editions, i.e., presence in downloads, possibly subject to license + coverage(!); see `disussion in PR #4300 + <https://github.com/spack/spack/pull/4300#issuecomment-305582898>`_. [NB: + An "mpi" subdirectory is not indicative of the full MPI SDK being present + (i.e., ``mpicc``, ..., and header files). The directory may just as well + contain only the MPI runtime (``mpirun`` and shared libraries) .] + See also issue #8632. + +The license is needed at installation time and to compile client packages, but +never to merely run any resulting binaries. The license status for a given +Spack package is normally specified in the *package code* through directives like +`license_required` (see :ref:`Licensed software <license>`). +For the Intel packages, however, the *class code* provides these directives (in +exchange of forfeiting a measure of OOP purity) and takes care of idiosyncasies +like historic version dependence. + +The libraries that are provided in the standalone packages are also included in the +all-encompassing ``intel-parallel-studio``. To complicate matters a bit, that +package is sold in 3 "editions", of which only the upper-tier ``cluster`` +edition supports *compiling* MPI applications, and hence only that edition can +provide the ``mpi`` virtual package. (As mentioned [fn2]_, all editions +provide support for *running* MPI applications.) + +The edition forms the leading part of the version number for Spack's +``intel*`` packages discussed here. This differs from the primarily numeric +version numbers seen with most other Spack packages. For example, we have: + + +.. code-block:: console + + $ spack info intel-parallel-studio + ... + Preferred version: + professional.2018.3 http:... + + Safe versions: + professional.2018.3 http:... + ... + composer.2018.3 http:... + ... + cluster.2018.3 http:... + ... + ... + +The full studio suite, capable of compiling MPI applications, currently +requires about 12 GB of disk space when installed (see section `Install steps +for packages with compilers and libraries`_ for detailed instructions). +If you need to save disk space or installation time, you could install the +``intel`` compilers-only subset (0.6 GB) and just the library packages you +need, for example ``intel-mpi`` (0.5 GB) and ``intel-mkl`` (2.5 GB). + + +"""""""""""""""""""" +Unrelated packages +"""""""""""""""""""" + +The following packages do not use the Intel installer and are not in class ``IntelPackage`` +that is discussed here: + +* ``intel-gpu-tools`` -- Test suite and low-level tools for the Linux `Direct + Rendering Manager <https://en.wikipedia.org/wiki/Direct_Rendering_Manager>`_ +* ``intel-mkl-dnn`` -- Math Kernel Library for Deep Neural Networks (``CMakePackage``) +* ``intel-xed`` -- X86 machine instructions encoder/decoder +* ``intel-tbb`` -- Standalone version of Intel Threading Building Blocks. Note that + a TBB runtime version is included with ``intel-mkl``, and development + versions are provided by the packages ``intel-parallel-studio`` (all + editions) and its ``intel`` subset. + +"""""""""""""""""""""""""""""""""""""""""" +Configuring Spack to use Intel licenses +"""""""""""""""""""""""""""""""""""""""""" + +If you wish to integrate licensed Intel products into Spack as external packages +(`route 1`_ above) we assume that their license configuration is in place and +is working [fn3]_. In this case, skip to section `Integration of Intel tools +installed external to Spack`_. + +If you plan to have Spack install licensed products for you (`route 2`_ above), +the Intel product installer that Spack will run underneath must have access to +a license that is either provided by a *license server* or as a *license file*. +The installer may be able to locate a license that is already configured on +your system. If it cannot, you must configure Spack to provide either the +server location or the license file. + +For authoritative information on Intel licensing, see: + +* https://software.intel.com/en-us/faq/licensing +* https://software.intel.com/en-us/articles/how-do-i-manage-my-licenses + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Pointing to an existing license server +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Installing and configuring a license server is outside the scope of Spack. We +assume that: + +* Your system administrator has a license server running. +* The license server offers valid licenses for the Intel packages of interest. +* You can access these licenses under the user id running Spack. + +Be aware of the difference between (a) installing and configuring a license +server, and (b) configuring client software to *use* a server's +so-called floating licenses. We are concerned here with (b) only. The +process of obtaining a license from a server for temporary use is called +"checking out a license". For that, a client application such as the Intel +package installer or a compiler needs to know the host name and port number of +one or more license servers that it may query [fn4]_. + +Follow one of three methods to `point client software to a floating license server +<https://software.intel.com/en-us/articles/licensing-setting-up-the-client-floating-license>`_. +Ideally, your license administrator will already have implemented one that can +be used unchanged in Spack: Look for the environment variable +``INTEL_LICENSE_FILE`` or for files +``/opt/intel/licenses/*.lic`` that contain:: + + SERVER hostname hostid_or_ANY portnum + USE_SERVER + +The relevant tokens, among possibly others, are the ``USE_SERVER`` line, +intended specifically for clients, and one or more ``SERVER`` lines above it +which give the network address. + +If you cannot find pre-existing ``/opt/intel/licenses/*.lic`` files and the +``INTEL_LICENSE_FILE`` environment variable is not set (even after you loaded +any relevant modulefiles), ask your license administrator for the server +address(es) and place them in a "global" license file within your Spack +directory tree `as shown below <Spack-managed file_>`_). + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Installing a standalone license file +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If you purchased a user-specific license, follow `Intel's instructions +<https://software.intel.com/en-us/faq/licensing#license-management>`_ +to "activate" it for your serial number, then download the resulting license file. +If needed, `request to have the file re-sent +<https://software.intel.com/en-us/articles/resend-license-file>`_ to you. + +Intel's license files are text files that contain tokens in the proprietary +"FLEXlm" format and whose name ends in ``.lic``. +Intel installers and compilers look for license files in several locations when they run. +Place your license by one of the following means, in order of decreasing preference: + +* Default directory + + Install your license file in the directory ``/opt/intel/licenses/`` if you + have write permission to it. This directory is inspected by all Intel tools + and is therefore preferred, as no further configuration will be needed. + Create the directory if it does not yet exist. For the file name, either + keep the downloaded name or use another suitably plain yet descriptive + name that ends in ``.lic``. Adjust file permissions for access by licensed + users. + + +* Directory given in environment variable + + If you cannot use the default directory, but your system already has set the + environment variable ``INTEL_LICENSE_FILE`` independent from Spack [fn5]_, + then, if you have the necessary write permissions, place your license file in + one of the directories mentioned in this environment variable. Adjust file + permissions to match licensed users. + + .. tip:: + + If your system has not yet set and used the environment variable + ``INTEL_LICENSE_FILE``, you could start using it with the ``spack + install`` stage of licensed tools and subsequent client packages. You + would, however, be in a bind to always set that variable in the same + manner, across updates and re-installations, and perhaps accommodate + additions to it. As this may be difficult in the long run, we recommend + that you do *not* attempt to start using the variable solely for Spack. + +.. _`Spack-managed file`: + +* Spack-managed file + + The first time Spack encounters an Intel package that requires a license, it + will initialize a Spack-global Intel-specific license file for you, as a + template with instructional comments, and bring up an editor [fn6]_. Spack + will do this *even if you have a working license elsewhere* on the system. + + * To proceed with an externally configured license, leave the newly templated + file as is (containing comments only) and close the editor. You do not need + to touch the file again. + + * To configure your own standalone license, copy the contents of your + downloaded license file into the opened file, save it, and close the editor. + + * To use a license server (i.e., a floating network license) that is not + already configured elsewhere on the system, supply your license server + address(es) in the form of ``SERVER`` and ``USE_SERVER`` lines at the + *beginning of the file* [fn7]_, in the format shown in section `Pointing to + an existing license server`_. Save the file and close the editor. + + To revisit and manually edit this file, such as prior to a subsequent + installation attempt, find it at + ``$SPACK_ROOT/etc/spack/licenses/intel/intel.lic`` . + + Spack will place symbolic links to this file in each directory where licensed + Intel binaries were installed. If you kept the template unchanged, Intel tools + will simply ignore it. + + +.. _integrate-external-intel: + +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Integration of Intel tools installed *external* to Spack +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This section discusses `route 1`_ from the introduction. + +A site that already uses Intel tools, especially licensed ones, will likely +have some versions already installed on the system, especially at a time when +Spack is just being introduced. It will be useful to make such previously +installed tools available for use by Spack as they are. How to do this varies +depending on the type of the tools: + +"""""""""""""""""""""""""""""""""" +Integrating external compilers +"""""""""""""""""""""""""""""""""" + +For Spack to use external Intel compilers, you must tell it both *where* to +find them and *when* to use them. The present section documents the "where" +aspect, involving ``compilers.yaml`` and, in most cases, long absolute paths. +The "when" aspect actually relates to `route 3`_ and requires explicitly +stating the compiler as a spec component (in the form ``foo %intel`` or ``foo +%intel@compilerversion``) when installing client packages or altering Spack's +compiler default in ``packages.yaml``. +See section `Selecting Intel compilers <Selecting Intel compilers_>`_ for details. + +To integrate a new set of externally installed Intel compilers into Spack +follow section +:ref:`Compiler configuration <compiler-config>`. +Briefly, prepare your shell environment like you would if you were to use these +compilers normally, i.e., typically by a ``module load ...`` or a shell +``source ...`` command, then use ``spack compiler find`` to make Spack aware of +these compilers. This will create a new entry in a suitably scoped and possibly new +``compilers.yaml`` file. You could certainly create such a compiler entry +manually, but this is error-prone due to the indentation and different data +types involved. + +The Intel compilers need and use the system's native GCC compiler (``gcc`` on +most systems, ``clang`` on macOS) to provide certain functionality, notably to +support C++. To provide a different GCC compiler for the Intel tools, or more +generally set persistent flags for all invocations of the Intel compilers, locate +the ``compilers.yaml`` entry that defines your Intel compiler, and, using a +text editor, change one or both of the following: + +1. At the ``modules:`` tag, add a ``gcc`` module to the list. +2. At the ``flags:`` tag, add ``cflags:``, ``cxxflags:``, and ``fflags:`` key-value entries. + +Consult the examples under +:ref:`Compiler configuration <compiler-config>` +and +:ref:`Vendor-Specific Compiler Configuration <vendor-specific-compiler-configuration>` +in the Spack documentation. +When done, validate your compiler definition by running +``spack compiler info intel@compilerversion`` (replacing ``compilerversion`` by +the version that you defined). + +Be aware that both the GCC integration and persistent compiler flags can also be +affected by an advanced third method: + +3. A modulefile that provides the Intel compilers for you + could, for the benefit of users outside of Spack, implicitly + integrate a specific ``gcc`` version via compiler flag environment variables + or (hopefully not) via a sneaky extra ``PATH`` addition. + +Next, visit section `Selecting Intel Compilers`_ to learn how to tell +Spack to use the newly configured compilers. + +"""""""""""""""""""""""""""""""""" +Integrating external libraries +"""""""""""""""""""""""""""""""""" + +Configure external library-type packages (as opposed to compilers) +in the files ``$SPACK_ROOT/etc/spack/packages.yaml`` or +``~/.spack/packages.yaml``, following the Spack documentation under +:ref:`External Packages <sec-external-packages>`. + +Similar to ``compilers.yaml``, the ``packages.yaml`` files define a package +external to Spack in terms of a Spack spec and resolve each such spec via +either the ``paths`` or ``modules`` tokens to a specific pre-installed package +version on the system. Since Intel tools generally need environment variables +to interoperate, which cannot be conveyed in a mere ``paths`` specification, +the ``modules`` token will be more sensible to use. It resolves the Spack-side +spec to a modulefile generated and managed outside of Spack's purview, +which Spack will load internally and transiently when the corresponding spec is +called upon to compile client packages. + +Unlike for compilers, where ``spack find compilers [spec]`` generates an entry +in an existing or new ``compilers.yaml`` file, Spack does not offer a command +to generate an entirely new ``packages.yaml`` entry. You must create +new entries yourself in a text editor, though the command ``spack config +[--scope=...] edit packages`` can help with selecting the proper file. +See section +:ref:`Configuration Scopes <configuration-scopes>` +for an explanation about the different files +and section +:ref:`Build customization <build-settings>` +for specifics and examples for ``packages.yaml`` files. + +.. If your system administrator did not provide modules for pre-installed Intel + tools, you could do well to ask for them, because installing multiple copies + of the Intel tools, as is wont to happen once Spack is in the picture, is + bound to stretch disk space and patience thin. If you *are* the system + administrator and are still new to modules, then perhaps it's best to follow + the `next section <Installing Intel tools within Spack_>`_ and install the tools + solely within Spack. + +The following example integrates packages embodied by hypothetical +external modulefiles ``intel-mkl/18/...`` into +Spack as packages ``intel-mkl@...``: + +.. code-block:: console + + $ spack config edit packages + +Make sure the file begins with: + +.. code-block:: yaml + + packages: + +Adapt the following example. Be sure to maintain the indentation: + +.. code-block:: yaml + + # other content ... + + intel-mkl: + modules: + intel-mkl@2018.2.199 arch=linux-centos6-x86_64: intel-mkl/18/18.0.2 + intel-mkl@2018.3.222 arch=linux-centos6-x86_64: intel-mkl/18/18.0.3 + +The version numbers for the ``intel-mkl`` specs defined here correspond to file +and directory names that Intel uses for its products because they were adopted +and declared as such within Spack's package repository. You can inspect the +versions known to your current Spack installation by: + +.. code-block:: console + + $ spack info intel-mkl + +Using the same version numbers for external packages as for packages known +internally is useful for clarity, but not strictly necessary. Moreover, with a +``packages.yaml`` entry, you can go beyond internally known versions. + +.. _compiler-neutral-package: + +Note that the Spack spec in the example does not contain a compiler +specification. This is intentional, as the Intel library packages can be used +unmodified with different compilers. + +A slightly more advanced example illustrates how to provide +:ref:`variants <basic-variants>` +and how to use the ``buildable: False`` directive to prevent Spack from installing +other versions or variants of the named package through its normal internal +mechanism. + +.. code-block:: yaml + + packages: + intel-parallel-studio: + modules: + intel-parallel-studio@cluster.2018.2.199 +mkl+mpi+ipp+tbb+daal arch=linux-centos6-x86_64: intel/18/18.0.2 + intel-parallel-studio@cluster.2018.3.222 +mkl+mpi+ipp+tbb+daal arch=linux-centos6-x86_64: intel/18/18.0.3 + buildable: False + +One additional example illustrates the use of ``paths:`` instead of +``modules:``, useful when external modulefiles are not available or not +suitable: + +.. code-block:: yaml + + packages: + intel-parallel-studio: + paths: + intel-parallel-studio@cluster.2018.2.199 +mkl+mpi+ipp+tbb+daal: /opt/intel + intel-parallel-studio@cluster.2018.3.222 +mkl+mpi+ipp+tbb+daal: /opt/intel + buildable: False + +Note that for the Intel packages discussed here, the directory values in the +``paths:`` entries must be the high-level and typically version-less +"installation directory" that has been used by Intel's product installer. +Such a directory will typically accumulate various product versions. Amongst +them, Spack will select the correct version-specific product directory based on +the ``@version`` spec component that each path is being defined for. + +For further background and details, see +:ref:`External Packages <sec-external-packages>`. + + +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Installing Intel tools *within* Spack +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This section discusses `route 2`_ from the introduction. + +When a system does not yet have Intel tools installed already, or the installed +versions are undesirable, Spack can install these tools like any regular Spack +package for you and, with appropriate pre- and post-install configuration, use its +compilers and/or libraries to install client packages. + +.. _intel-install-studio: + +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +Install steps for packages with compilers and libraries +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +The packages ``intel-parallel-studio`` and ``intel`` (which is a subset of the +former) are many-in-one products that contain both compilers and a set of +library packages whose scope depends on the edition. +Because they are general products geared towards shell environments, +it can be somewhat involved to integrate these packages at their full extent +into Spack. + +Note: To install library-only packages like ``intel-mkl``, ``intel-mpi``, and ``intel-daal`` +follow `the next section <intel-install-libs_>`_ instead. + +1. Review the section `Configuring spack to use intel licenses`_. + +.. _intel-compiler-anticipation: + +2. To install a version of ``intel-parallel-studio`` that provides Intel + compilers at a version that you have *not yet declared in Spack*, + the following preparatory steps are recommended: + + A. Determine the compiler spec that the new ``intel-parallel-studio`` package + will provide, as follows: From the package version, combine the last two + digits of the version year, a literal "0" (zero), and the version component + that immediately follows the year. + + ========================================== ====================== + Package version Compiler spec provided + ------------------------------------------ ---------------------- + ``intel-parallel-studio@edition.YYyy.u`` ``intel@yy.0.u`` + ========================================== ====================== + + Example: The package ``intel-parallel-studio@cluster.2018.3`` will provide + the compiler with spec ``intel@18.0.3``. + + .. _`config-compiler-anticipated`: + + B. Add a new compiler section with the newly anticipated version at the + end of a ``compilers.yaml`` file in a suitable scope. For example, run: + + .. code-block:: console + + $ spack config --scope=user/linux edit compilers + + and append a stub entry: + + .. code-block:: yaml + + - compiler: + target: x86_64 + operating_system: centos6 + modules: [] + spec: intel@18.0.3 + paths: + cc: stub + cxx: stub + f77: stub + fc: stub + + Replace ``18.0.3`` with the version that you determined in the preceeding + step. The contents under ``paths:`` do not matter yet. + + You are right to ask: "Why on earth is that necessary?" [fn8]_. + The answer lies in Spack striving for strict compiler consistency. + Consider what happens without such a pre-declared compiler stub: + Say, you ask Spack to install a particular version + ``intel-parallel-studio@edition.V``. Spack will apply an unrelated compiler + spec to concretize and install your request, resulting in + ``intel-parallel-studio@edition.V %X``. That compiler ``%X`` is not going to + be the version that this new package itself provides. Rather, it would + typically be ``%gcc@...`` in a default Spack installation or possibly indeed + ``%intel@...``, but at a version that precedes ``V``. + + The problem comes to the fore as soon as you try to use any virtual ``mkl`` + or ``mpi`` packages that you would expect to now be provided by + ``intel-parallel-studio@edition.V``. Spack will indeed see those virtual + packages, but only as being tied to the compiler that the package + ``intel-parallel-studio@edition.V`` was concretized with *at installation*. + If you were to install a client package with the new compilers now available + to you, you would naturally run ``spack install foo +mkl %intel@V``, yet + Spack will either complain about ``mkl%intel@V`` being missing (because it + only knows about ``mkl%X``) or it will go and attempt to install *another + instance* of ``intel-parallel-studio@edition.V %intel@V`` so as to match the + compiler spec ``%intel@V`` that you gave for your client package ``foo``. + This will be unexpected and will quickly get annoying because each + reinstallation takes up time and extra disk space. + + To escape this trap, put the compiler stub declaration shown here in place, + then use that pre-declared compiler spec to install the actual package, as + shown next. This approach works because during installation only the + package's own self-sufficient installer will be used, not any compiler. + + .. _`verify-compiler-anticipated`: + +3. Verify that the compiler version provided by the new ``studio`` version + would be used as expected if you were to compile a client package: + + .. code-block:: console + + $ spack spec zlib %intel + + If the version does not match, explicitly state the anticipated compiler version, e.g.: + + .. code-block:: console + + $ spack spec zlib %intel@18.0.3 + + if there are problems, review and correct the compiler's ``compilers.yaml`` + entry, be it still in stub form or already complete (as it would be for a + re-installation). + +4. Install the new ``studio`` package using Spack's regular ``install`` + command. + It may be wise to provide the anticipated compiler (`see above + <verify-compiler-anticipated_>`_) as an explicit concretization + element: + + .. code-block:: console + + $ spack install intel-parallel-studio@cluster.2018.3 %intel@18.0.3 + +5. Follow the same steps as under `Integrating external compilers`_ to tell + Spack the minutiae for actually using those compilers with client packages. + If you placed a stub entry in a ``compilers.yaml`` file, now is the time to + edit it and fill in the particulars. + + * Under ``paths:``, give the full paths to the actual compiler binaries (``icc``, + ``ifort``, etc.) located within the Spack installation tree, in all their + unsightly length [fn9]_. + + To determine the full path to the C compiler, adapt and run: + + .. code-block:: console + + $ find `spack location -i intel-parallel-studio@cluster.2018.3` \ + -name icc -type f -ls + + If you get hits for both ``intel64`` and ``ia32``, you almost certainly will + want to use the ``intel64`` variant. The ``icpc`` and ``ifort`` compilers + will be located in the same directory as ``icc``. + + * Use the ``modules:`` and/or ``cflags:`` tokens to specify a suitable accompanying + ``gcc`` version to help pacify picky client packages that ask for C++ + standards more recent than supported by your system-provided ``gcc`` and its + ``libstdc++.so``. + + * To set the Intel compilers for default use in Spack, instead of the usual ``%gcc``, + follow section `Selecting Intel compilers`_. + +.. tip:: + + Compiler packages like ``intel-parallel-studio`` can easily be above 10 GB + in size, which can tax the disk space available for temporary files on + small, busy, or restricted systems (like virtual machines). The Intel + installer will stop and report insufficient space as:: + + ==> './install.sh' '--silent' 'silent.cfg' + ... + Missing critical prerequisite + -- Not enough disk space + + As first remedy, clean Spack's existing staging area: + + .. code-block:: console + + $ spack clean --stage + + then retry installing the large package. Spack normally cleans staging + directories but certain failures may prevent it from doing so. + + If the error persists, tell Spack to use an alternative location for + temporary files: + + 1. Run ``df -h`` to identify an alternative location on your system. + + 2. Tell Spack to use that location for staging. Do **one** of the following: + + * Run Spack with the environment variable ``TMPDIR`` altered for just a + single command. For example, to use your ``$HOME`` directory: + + .. code-block:: console + + $ TMPDIR="$HOME/spack-stage" spack install .... + + This example uses Bourne shell syntax. Adapt for other shells as needed. + + * Alternatively, customize + Spack's ``build_stage`` :ref:`configuration setting <config-overrides>`. + + .. code-block:: console + + $ spack config edit config + + Append: + + .. code-block:: yaml + + config: + build_stage: + - /home/$user/spack-stage + + Do not duplicate the ``config:`` line if it already is present. + Adapt the location, which here is the same as in the preceeding example. + + 3. Retry installing the large package. + + +.. _intel-install-libs: + +"""""""""""""""""""""""""""""""""""""""""""""""""""""""" +Install steps for library-only packages +"""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +To install library-only packages like ``intel-mkl``, ``intel-mpi``, and ``intel-daal`` +follow the steps given here. +For packages that contain a compiler, follow `the previous section +<intel-install-studio_>`_ instead. + +1. For pre-2017 product releases, review the section `Configuring Spack to use Intel licenses`_. + +2. Inspect the package spec. Specify an explicit compiler if necessary, e.g.: + + .. code-block:: console + + $ spack spec intel-mpi@2018.3.199 + $ spack spec intel-mpi@2018.3.199 %intel + + Check that the package will use the compiler flavor and version that you expect. + +3. Install the package normally within Spack. Use the same spec as in the + previous command, i.e., as general or as specific as needed: + + .. code-block:: console + + $ spack install intel-mpi@2018.3.199 + $ spack install intel-mpi@2018.3.199 %intel@18 + +4. To prepare the new packages for use with client packages, + follow `Selecting libraries to satisfy virtual packages`_. + + +"""""""""""""""" +Debug notes +"""""""""""""""" + +* You can trigger a wall of additional diagnostics using Spack options, e.g.: + + .. code-block:: console + + $ spack --debug -v install intel-mpi + + The ``--debug`` option can also be useful while installing client + packages `(see below) <Using Intel tools in Spack to install client + packages_>`_ to confirm the integration of the Intel tools in Spack, notably + MKL and MPI. + +* The ``.spack/`` subdirectory of an installed ``IntelPackage`` will contain, + besides Spack's usual archival items, a copy of the ``silent.cfg`` file that + was passed to the Intel installer: + + .. code-block:: console + + $ grep COMPONENTS ...intel-mpi...<hash>/.spack/silent.cfg + COMPONENTS=ALL + +* If an installation error occurs, Spack will normally clean up and remove a + partially installed target directory. You can direct Spack to keep it using + ``--keep-prefix``, e.g.: + + .. code-block:: console + + $ spack install --keep-prefix intel-mpi + + You must, however, *remove such partial installations* prior to subsequent + installation attempts. Otherwise, the Intel installer will behave + incorrectly. + + +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Using Intel tools in Spack to install client packages +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Finally, this section pertains to `route 3`_ from the introduction. + +Once Intel tools are installed within Spack as external or internal packages +they can be used as intended for installing client packages. + + +.. _`select-intel-compilers`: + +"""""""""""""""""""""""""" +Selecting Intel compilers +"""""""""""""""""""""""""" + +Select Intel compilers to compile client packages, like any compiler in Spack, +by one of the following means: + +* Request the Intel compilers explicitly in the client spec, e.g.: + + .. code-block:: console + + $ spack install libxc@3.0.0%intel + + +* Alternatively, request Intel compilers implicitly by concretization preferences. + Configure the order of compilers in the appropriate ``packages.yaml`` file, + under either an ``all:`` or client-package-specific entry, in a + ``compiler:`` list. Consult the Spack documentation for + :ref:`Configuring Package Preferences <configs-tutorial-package-prefs>` + and + :ref:`Concretization Preferences <concretization-preferences>`. + +Example: ``etc/spack/packages.yaml`` might simply contain: + +.. code-block:: yaml + + packages: + all: + compiler: [ intel, gcc, ] + +To be more specific, you can state partial or full compiler version numbers, +for example: + +.. code-block:: yaml + + packages: + all: + compiler: [ intel@18, intel@17, gcc@4.4.7, gcc@4.9.3, gcc@7.3.0, ] + + + +"""""""""""""""""""""""""""""""""""""""""""""""" +Selecting libraries to satisfy virtual packages +"""""""""""""""""""""""""""""""""""""""""""""""" + +Intel packages, whether integrated into Spack as external packages or +installed within Spack, can be called upon to satisfy the requirement of a +client package for a library that is available from different providers. +The relevant virtual packages for Intel are ``blas``, ``lapack``, +``scalapack``, and ``mpi``. + +In both integration routes, Intel packages can have optional +:ref:`variants <basic-variants>` +which alter the list of virtual packages they can satisfy. For Spack-external +packages, the active variants are a combination of the defaults declared in +Spack's package repository and the spec it is declared as in ``packages.yaml``. +Needless to say, those should match the components that are actually present in +the external product installation. Likewise, for Spack-internal packages, the +active variants are determined, persistently at installation time, from the +defaults in the repository and the spec selected to be installed. + +To have Intel packages satisfy virtual package requests for all or selected +client packages, edit the ``packages.yaml`` file. Customize, either in the +``all:`` or a more specific entry, a ``providers:`` dictionary whose keys are +the virtual packages and whose values are the Spack specs that satisfy the +virtual package, in order of decreasing preference. To learn more about the +``providers:`` settings, see the Spack tutorial for +:ref:`Configuring Package Preferences <configs-tutorial-package-prefs>` +and the section +:ref:`Concretization Preferences <concretization-preferences>`. + +Example: The following fairly minimal example for ``packages.yaml`` shows how +to exclusively use the standalone ``intel-mkl`` package for all the linear +algebra virtual packages in Spack, and ``intel-mpi`` as the preferred MPI +implementation. Other providers can still be chosen on a per-package basis. + +.. code-block:: yaml + + packages: + all: + providers: + mpi: [intel-mpi] + blas: [intel-mkl] + lapack: [intel-mkl] + scalapack: [intel-mkl] + +If you have access to the ``intel-parallel-studio@cluster`` edition, you can +use instead: + +.. code-block:: yaml + + all: + providers: + mpi: [intel-parallel-studio+mpi] + # Note: +mpi vs. +mkl + blas: [intel-parallel-studio+mkl] + lapack: [intel-parallel-studio+mkl] + scalapack: [intel-parallel-studio+mkl] + +If you installed ``intel-parallel-studio`` within Spack ("`route 2`_"), make +sure you followed the `special installation step +<intel-compiler-anticipation_>`_ to ensure that its virtual packages match the +compilers it provides. + + +"""""""""""""""""""""""""""""""""""""""""""" +Using Intel tools as explicit dependency +"""""""""""""""""""""""""""""""""""""""""""" + +With the proper installation as detailed above, no special steps should be +required when a client package specifically (and thus deliberately) requests an +Intel package as dependency, this being one of the target use cases for Spack. + + +""""""""""""""""""""""""""""""""""""""""""""""" +Tips for configuring client packages to use MKL +""""""""""""""""""""""""""""""""""""""""""""""" + +The Math Kernel Library (MKL) is provided by several Intel packages, currently +``intel-parallel-studio`` when variant ``+mkl`` is active (it is by default) +and the standalone ``intel-mkl``. Because of these different provider packages, +a *virtual* ``mkl`` package is declared in Spack. + +* To use MKL-specific APIs in a client package: + + Declare a dependency on ``mkl``, rather than a specific provider like + ``intel-mkl``. Declare the dependency either absolutely or conditionally + based on variants that your package might have declared: + + .. code-block:: python + + # Examples for absolute and conditional dependencies: + depends_on('mkl') + depends_on('mkl', when='+mkl') + depends_on('mkl', when='fftw=mkl') + + The ``MKLROOT`` environment variable (part of the documented API) will be set + during all stages of client package installation, and is available to both + the Spack packaging code and the client code. + +* To use MKL as provider for BLAS, LAPACK, or ScaLAPACK: + + The packages that provide ``mkl`` also provide the narrower + virtual ``blas``, ``lapack``, and ``scalapack`` packages. + See the relevant :ref:`Packaging Guide section <blas_lapack_scalapack>` + for an introduction. + To portably use these virtual packages, construct preprocessor and linker + option strings in your package configuration code using the package functions + ``.headers`` and ``.libs`` in conjunction with utility functions from the + following classes: + + * :py:class:`llnl.util.filesystem.FileList`, + * :py:class:`llnl.util.filesystem.HeaderList`, + * :py:class:`llnl.util.filesystem.LibraryList`. + + .. tip:: + *Do not* use constructs like ``.prefix.include`` or ``.prefix.lib``, with + Intel or any other implementation of ``blas``, ``lapack``, and + ``scalapack``. + + For example, for an + :ref:`AutotoolsPackage <autotoolspackage>` + use ``.libs.ld_flags`` to transform the library file list into linker options + passed to ``./configure``: + + .. code-block:: python + + def configure_args(self): + args = [] + ... + args.append('--with-blas=%s' % self.spec['blas'].libs.ld_flags) + args.append('--with-lapack=%s' % self.spec['lapack'].libs.ld_flags) + ... + + .. tip:: + Even though ``.ld_flags`` will return a string of multiple words, *do not* + use quotes for options like ``--with-blas=...`` because Spack passes them + to ``./configure`` without invoking a shell. + + Likewise, in a + :ref:`MakefilePackage <makefilepackage>` + or similiar package that does not use AutoTools you may need to provide include + and link options for use on command lines or in environment variables. + For example, to generate an option string of the form ``-I<dir>``, use: + + .. code-block:: python + + self.spec['blas'].headers.include_flags + + and to generate linker options (``-L<dir> -llibname ...``), use the same as above, + + .. code-block:: python + + self.spec['blas'].libs.ld_flags + + See + :ref:`MakefilePackage <makefilepackage>` + and more generally the + :ref:`Packaging Guide <blas_lapack_scalapack>` + for background and further examples. + + +^^^^^^^^^^ +Footnotes +^^^^^^^^^^ + +.. [fn1] Strictly speaking, versions from ``2017.2`` onward. + +.. [fn2] The package ``intel`` intentionally does not have a ``+mpi`` variant since + it is meant to be small. The native installer will always add MPI *runtime* + components because it follows defaults defined in the download package, even + when ``intel-parallel-studio ~mpi`` has been requested. + + For ``intel-parallel-studio +mpi``, the class function + :py:func:``.IntelPackage.pset_components`` + will include ``"intel-mpi intel-imb"`` in a list of component patterns passed + to the Intel installer. The installer will extend each pattern word with an + implied glob-like ``*`` to resolve it to package names that are + *actually present in the product BOM*. + As a side effect, this pattern approach accommodates occasional package name + changes, e.g., capturing both ``intel-mpirt`` and ``intel-mpi-rt`` . + +.. [fn3] How could the external installation have succeeded otherwise? + +.. [fn4] According to Intel's documentation, there is supposedly a way to install a + product using a network license even `when a FLEXlm server is not running + <https://software.intel.com/en-us/articles/licensing-setting-up-the-client-floating-license>`_: + Specify the license in the form ``port@serverhost`` in the + ``INTEL_LICENSE_FILE`` environment variable. All other means of specifying a + network license require that the license server be up. + +.. [fn5] Despite the name, ``INTEL_LICENSE_FILE`` can hold several and diverse entries. + They can be either directories (presumed to contain ``*.lic`` files), file + names, or network locations in the form ``port@host`` (on Linux and Mac), + with all items separated by ":" (on Linux and Mac). + +.. [fn6] Should said editor turn out to be ``vi``, you better be in a position + to know how to use it. + +.. [fn7] Comment lines in FLEXlm files, indicated by ``#`` as the first + non-whitespace character on the line, are generally allowed anywhere in the file. + There `have been reports <https://github.com/spack/spack/issues/6534>`_, + however, that as of 2018, ``SERVER`` and ``USE_SERVER`` lines must precede + any comment lines. + +.. + .. [fnX] The name component ``intel`` of the compiler spec is separate from (in + a different namespace than) the names of the Spack packages + ``intel-parallel-studio`` and ``intel``. Both of the latter provide the former. + +.. [fn8] Spack's close coupling of installed packages to compilers, which both + necessitates the detour for installing ``intel-parallel-studio``, and + largely limits any of its provided virtual packages to a single compiler, heavily + favors `recommending to install Intel Parallel Studio outside of Spack + <integrate-external-intel_>`_ and declare it for Spack in ``packages.yaml`` + by a `compiler-less spec <compiler-neutral-package_>`_. + +.. [fn9] With some effort, you can convince Spack to use shorter paths. + + .. warning:: Altering the naming scheme means that Spack will lose track of + all packages it has installed for you so far. + That said, the time is right for this kind of customization + when you are defining a new set of compilers. + + The relevant tunables are: + + 1. Set the ``install_tree`` location in ``config.yaml`` + (:ref:`see doc <config-yaml>`). + 2. Set the hash length in ``install-path-scheme``, also in ``config.yaml`` + (:ref:`q.v. <config-yaml>`). + 3. You will want to set the *same* hash length for + :ref:`tcl module files <modules-naming-scheme>` + if you have Spack produce them for you, under ``naming_scheme`` in + ``modules.yaml``. Other module dialects cannot be altered in this manner. |