diff --git a/pkgs/development/libraries/science/math/atlas/default.nix b/pkgs/development/libraries/science/math/atlas/default.nix index 938778734e09..3cdab4df16f4 100644 --- a/pkgs/development/libraries/science/math/atlas/default.nix +++ b/pkgs/development/libraries/science/math/atlas/default.nix @@ -1,5 +1,7 @@ { stdenv, fetchurl, gfortran, tolerateCpuTimingInaccuracy ? true, shared ? false -, cpuConfig ? if stdenv.isi686 then "-b 32 -A 18 -V 1" else "-b 64 -A 31 -V 384" +, cpuConfig ? if stdenv.isi686 then "-b 32 -A 12 -V 1" else "-b 64 -A 14 -V 384" +, cacheEdge ? "262144" +, threads ? "0" }: # Atlas detects the CPU and optimizes its build accordingly. This is great when @@ -9,27 +11,40 @@ # cannot execute. # # To avoid these issues, the build is configured using the 'cpuConfig' -# parameter as follows: +# parameter. Upstream recommends these defaults for distributions: # # | x86 CPU | x86_64 CPU | # |---------------------------------------------+------------------------| # | -b 32 | -b 64 | -# | -A 18 (Pentium II) | -A 31 (Athlon K7) | -# | -V 1 (No SIMD: Pentium II doesn't have SSE) | -V 384 (SSE1 and SSE2) | +# | -A 12 (x86x87) | -A 14 (x86SSE2) | +# | -V 1 (No SIMD) | -V 384 (SSE1 and SSE2) | # -# Users who want to compile a highly optimized version of ATLAS that's suitable -# for their local machine can override these settings accordingly. +# These defaults should give consistent performance across machines. +# Performance will be substantially lower than an optimized build, but a build +# optimized for one machine will give even worse performance on others. If you +# are a serious user of Atlas (e.g., you write code that uses it) you should +# compile an optimized version for each of your machines. +# +# The parameter 'cacheEdge' sets the L2 cache per core (in bytes). Setting this +# parameter reduces build time because some tests to detect the L2 cache size +# will not be run. It will also reduce impurity; different build nodes on Hydra +# may have different L2 cache sizes, but fixing the L2 cache size should +# account for that. This also makes the performance of binary substitutes more +# consistent. # # The -V flags can change with each release as new instruction sets are added # because upstream thinks it's a good idea to add entries at the start of an # enum, rather than the end. If the build suddenly fails with messages about # missing instruction sets, you may need to poke around in the source a bit. +# +# Upstream recommends the x86x87/x86SSE2 architectures for generic x86/x86_64 +# for distribution builds. Additionally, we set 'cacheEdge' to reduce impurity. +# Otherwise, the cache parameters will be detected by timing which will be +# highly variable on Hydra. let + inherit (stdenv.lib) optional optionalString; version = "3.10.2"; - - optionalString = stdenv.lib.optionalString; - optional = stdenv.lib.optional; in stdenv.mkDerivation { @@ -50,27 +65,50 @@ stdenv.mkDerivation { patches = optional tolerateCpuTimingInaccuracy ./disable-timing-accuracy-check.patch; # Configure outside of the source directory. - preConfigure = '' mkdir build; cd build; configureScript=../configure; ''; + preConfigure = '' + mkdir build + cd build + configureScript=../configure + ''; # * -fPIC is passed even in non-shared builds so that the ATLAS code can be # used to inside of shared libraries, like Octave does. # # * -t 0 disables use of multi-threading. It's not quite clear what the # consequences of that setting are and whether it's necessary or not. - configureFlags = "-Fa alg -fPIC -t 0 ${cpuConfig}" + optionalString shared " --shared"; + configureFlags = [ + "-Fa alg" + "-fPIC" + "-t ${threads}" + cpuConfig + ] ++ optional shared "--shared"; + + postConfigure = '' + if [[ -n "${cacheEdge}" ]]; then + echo '#define CacheEdge ${cacheEdge}' >> include/atlas_cacheedge.h + echo '#define CacheEdge ${cacheEdge}' >> include/atlas_tcacheedge.h + fi + ''; doCheck = true; + postInstall = '' + # Avoid name collision with the real lapack (ATLAS only builds a partial + # lapack). + mv $out/lib/liblapack.a $out/lib/liblapack_atlas.a + ''; + meta = { homepage = "http://math-atlas.sourceforge.net/"; description = "Automatically Tuned Linear Algebra Software (ATLAS)"; license = stdenv.lib.licenses.bsd3; longDescription = '' - The ATLAS (Automatically Tuned Linear Algebra Software) project is an ongoing - research effort focusing on applying empirical techniques in order to provide - portable performance. At present, it provides C and Fortran77 interfaces to a - portably efficient BLAS implementation, as well as a few routines from LAPACK. + The ATLAS (Automatically Tuned Linear Algebra Software) project is an + ongoing research effort focusing on applying empirical techniques in + order to provide portable performance. At present, it provides C and + Fortran77 interfaces to a portably efficient BLAS implementation, as well + as a few routines from LAPACK. ''; maintainers = with stdenv.lib.maintainers; [ ttuegel ];