spack/lib/spack/env
Massimiliano Culpo 3c4322bf1a targets: Spack targets can now be fine-grained microarchitectures
Spack can now:

- label ppc64, ppc64le, x86_64, etc. builds with specific
  microarchitecture-specific names, like 'haswell', 'skylake' or
  'icelake'.

- detect the host architecture of a machine from /proc/cpuinfo or similar
  tools.

- Understand which microarchitectures are compatible with which (for
  binary reuse)

- Understand which compiler flags are needed (for GCC, so far) to build
  binaries for particular microarchitectures.

All of this is managed through a JSON file (microarchitectures.json) that
contains detailed auto-detection, compiler flag, and compatibility
information for specific microarchitecture targets.  The `llnl.util.cpu`
module implements a library that allows detection and comparison of
microarchitectures based on the data in this file.

The `target` part of Spack specs is now essentially a Microarchitecture
object, and Specs' targets can be compared for compatibility as well.
This allows us to label optimized binary packages at a granularity that
enables them to be reused on compatible machines.  Previously, we only
knew that a package was built for x86_64, NOT which x86_64 machines it
was usable on.

Currently this feature supports Intel, Power, and AMD chips. Support for
ARM is forthcoming.

Specifics:

- Add microarchitectures.json with descriptions of architectures

- Relaxed semantic of compiler's "target" attribute.  Before this change
  the semantic to check if a compiler could be viable for a given target
  was exact match. This made sense as the finest granularity of targets
  was architecture families.  As now we can target micro-architectures,
  this commit changes the semantic by interpreting as the architecture
  family what is stored in the compiler's "target" attribute. A compiler
  is then a viable choice if the target being concretized belongs to the
  same family. Similarly when a new compiler is detected the architecture
  family is stored in the "target" attribute.

- Make Spack's `cc` compiler wrapper inject target-specific flags on the
  command line

- Architecture concretization updated to use the same algorithm as
  compiler concretization

- Micro-architecture features, vendor, generation etc. are included in
  the package hash.  Generic architectures, such as x86_64 or ppc64, are
  still dumped using the name only.

- If the compiler for a target is not supported exit with an intelligible
  error message. If the compiler support is unknown don't try to use
  optimization flags.

- Support and define feature aliases (e.g., sse3 -> ssse3) in
  microarchitectures.json and on Microarchitecture objects. Feature
  aliases are defined in targets.json and map a name (the "alias") to a
  list of rules that must be met for the test to be successful. The rules
  that are available can be extended later using a decorator.

- Implement subset semantics for comparing microarchitectures (treat
  microarchitectures as a partial order, i.e. (a < b), (a == b) and (b <
  a) can all be false.

- Implement logic to automatically demote the default target if the
  compiler being used is too old to optimize for it. Updated docs to make
  this behavior explicit.  This avoids surprising the user if the default
  compiler is older than the host architecture.

This commit adds unit tests to verify the semantics of target ranges and
target lists in constraints. The implementation to allow target ranges
and lists is minimal and doesn't add any new type.  A more careful
refactor that takes into account the type system might be due later.

Co-authored-by: Gregory Becker <becker33.llnl.gov>
2019-09-20 00:51:37 -07:00
..
arm Armcompiler (#9840) 2019-01-08 16:31:25 -08:00
case-insensitive Dependencies now work. Added libelf, libdwarf. 2013-02-18 23:46:04 -08:00
cce cc: clean up cray compilers, fix issues with case-insensitive filesystems (#10323) 2019-01-12 17:37:20 -08:00
clang compilers/clang: add flang (#5503) 2017-10-10 13:52:10 -07:00
fj Add Fujitsu compiler to Spack. (#11287) 2019-05-21 20:31:14 -05:00
gcc Fix #254: libtool & distutils want certain compiler names. 2015-12-19 02:06:47 -08:00
intel Fix #254: libtool & distutils want certain compiler names. 2015-12-19 02:06:47 -08:00
nag Add symlink for NAG Fortran Compiler 2016-01-19 13:07:07 -06:00
pgi Modifications to get PGI working 2016-03-03 16:50:51 -06:00
xl Fix #254: libtool & distutils want certain compiler names. 2015-12-19 02:06:47 -08:00
xl_r Add support for IBM threaded compilers: xl*_r (#2894) 2017-01-25 16:26:17 -07:00
c89 Dependencies now work. Added libelf, libdwarf. 2013-02-18 23:46:04 -08:00
c99 Dependencies now work. Added libelf, libdwarf. 2013-02-18 23:46:04 -08:00
c++ Dependencies now work. Added libelf, libdwarf. 2013-02-18 23:46:04 -08:00
cc targets: Spack targets can now be fine-grained microarchitectures 2019-09-20 00:51:37 -07:00
cpp Dependencies now work. Added libelf, libdwarf. 2013-02-18 23:46:04 -08:00
f77 Fix for SPACK-35: Fortran not working properly 2014-07-09 01:28:23 -07:00
f90 Fix for SPACK-35: Fortran not working properly 2014-07-09 01:28:23 -07:00
f95 Fix for SPACK-35: Fortran not working properly 2014-07-09 01:28:23 -07:00
fc Fix for SPACK-35: Fortran not working properly 2014-07-09 01:28:23 -07:00
ftn Add ftn to lib/spack/env (#11180) 2019-04-17 13:12:25 -07:00
ld Dependencies now work. Added libelf, libdwarf. 2013-02-18 23:46:04 -08:00