120 lines
4.8 KiB
Nix
120 lines
4.8 KiB
Nix
{ stdenv, fetchurl, gfortran, tolerateCpuTimingInaccuracy ? true, shared ? false
|
|
, cpuConfig ? if stdenv.isi686 then "-b 32 -A 12 -V 1" else "-b 64 -A 14 -V 384"
|
|
, cacheEdge ? "262144"
|
|
, threads ? "0"
|
|
, liblapack, withLapack
|
|
}:
|
|
|
|
# Atlas detects the CPU and optimizes its build accordingly. This is great when
|
|
# the code is run on the same machine that built the binary, but in case of a
|
|
# central build farm like Hydra, this feature is dangerous because the code may
|
|
# be generated utilizing fancy features that users who download the binary
|
|
# cannot execute.
|
|
#
|
|
# To avoid these issues, the build is configured using the 'cpuConfig'
|
|
# parameter. Upstream recommends these defaults for distributions:
|
|
#
|
|
# | x86 CPU | x86_64 CPU |
|
|
# |---------------------------------------------+------------------------|
|
|
# | -b 32 | -b 64 |
|
|
# | -A 12 (x86x87) | -A 14 (x86SSE2) |
|
|
# | -V 1 (No SIMD) | -V 384 (SSE1 and SSE2) |
|
|
#
|
|
# 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";
|
|
in
|
|
|
|
stdenv.mkDerivation {
|
|
name = "atlas-${version}" + optionalString withLapack "-with-lapack";
|
|
|
|
src = fetchurl {
|
|
url = "mirror://sourceforge/math-atlas/atlas${version}.tar.bz2";
|
|
sha256 = "0bqh4bdnjdyww4mcpg6kn0x7338mfqbdgysn97dzrwwb26di7ars";
|
|
};
|
|
|
|
buildInputs = [ gfortran ];
|
|
|
|
# Atlas aborts the build if it detects that some kind of CPU frequency
|
|
# scaling is active on the build machine because that feature offsets the
|
|
# performance timings. We ignore that check, however, because with binaries
|
|
# being pre-built on Hydra those timings aren't accurate for the local
|
|
# machine in the first place.
|
|
patches = optional tolerateCpuTimingInaccuracy ./disable-timing-accuracy-check.patch;
|
|
|
|
# Configure outside of the source directory.
|
|
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 ${threads}"
|
|
cpuConfig
|
|
] ++ optional shared "--shared"
|
|
++ optional withLapack "--with-netlib-lapack-tarfile=${liblapack.src}";
|
|
|
|
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 unless withLapack = true).
|
|
if ${if withLapack then "false" else "true"}; then
|
|
mv $out/lib/liblapack.a $out/lib/liblapack_atlas.a
|
|
fi
|
|
'';
|
|
|
|
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.
|
|
'';
|
|
|
|
maintainers = with stdenv.lib.maintainers; [ ttuegel ];
|
|
};
|
|
}
|