about summary refs log tree commit diff
path: root/pkgs/development/libraries/science/math/atlas
diff options
context:
space:
mode:
authorThomas Tuegel <ttuegel@gmail.com>2014-12-15 11:16:46 -0600
committerThomas Tuegel <ttuegel@gmail.com>2014-12-27 13:40:40 -0600
commit91657e30cae8ffc1dd228a5045f875ccfc62ed8e (patch)
treed4aeb267b26f0905ecb1332cd9c12cf654f4bac0 /pkgs/development/libraries/science/math/atlas
parent8a5d7e794449908d0c1009a0559d97c28497f714 (diff)
downloadnixlib-91657e30cae8ffc1dd228a5045f875ccfc62ed8e.tar
nixlib-91657e30cae8ffc1dd228a5045f875ccfc62ed8e.tar.gz
nixlib-91657e30cae8ffc1dd228a5045f875ccfc62ed8e.tar.bz2
nixlib-91657e30cae8ffc1dd228a5045f875ccfc62ed8e.tar.lz
nixlib-91657e30cae8ffc1dd228a5045f875ccfc62ed8e.tar.xz
nixlib-91657e30cae8ffc1dd228a5045f875ccfc62ed8e.tar.zst
nixlib-91657e30cae8ffc1dd228a5045f875ccfc62ed8e.zip
atlas: fix generic options
Build atlas with the generic options recommended by the upstream
documentation for distributions. The expression now takes the parameter
'threads' which configures the number of threads atlas will use. The
default is to build serial atlas ('threads = "0"'). The expression also
takes the parameter 'cacheEdge' which is the L2 cache per core, in
bytes. This reduces build time because the cache size doesn't need to be
detected. It also reduces impurity, since different build nodes on Hydra
may have different hardware. It is set to 256k by default, which is
recommended for distributions by the upstream documentation.
Diffstat (limited to 'pkgs/development/libraries/science/math/atlas')
-rw-r--r--pkgs/development/libraries/science/math/atlas/default.nix68
1 files changed, 53 insertions, 15 deletions
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 ];