3
0
Fork 0
forked from mirrors/nixpkgs

atlas: allow users to override the CPU configuration used to build ATLAS

This commit is contained in:
Peter Simons 2013-02-06 12:26:59 +01:00
parent 3334f33daf
commit 83df975ba8

View file

@ -1,4 +1,24 @@
{ stdenv, fetchurl, gfortran, tolerateCpuTimingInaccuracy ? true, shared ? false }:
{ stdenv, fetchurl, gfortran, tolerateCpuTimingInaccuracy ? true, shared ? false
, cpuConfig ? if stdenv.isi686 then "-b 32 -A 18 -V 1" else "-b 64 -A 31 -V 192"
}:
# 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 as follows:
#
# | 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 192 (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.
let
version = "3.10.1";
@ -15,6 +35,8 @@ stdenv.mkDerivation {
sha256 = "11ncgdc7kzb2y2gqb3sgarm5saj9fr07r3h2yh2h5bja429b85d2";
};
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
@ -25,30 +47,19 @@ stdenv.mkDerivation {
# Configure outside of the source directory.
preConfigure = '' mkdir build; cd build; configureScript=../configure; '';
# * -fPIC allows to build atlas inside shared objects, as octave does.
# * -fPIC is passed even in non-shared builds so that the ATLAS code can be
# used to inside of shared libraries, like Octave does.
#
# * Atlas detects the cpu and does some tricks. For example, notices the
# hydra AMD Family 10h computer, and uses a SSE trick for it (bit 17 of MXCSR)
# available, for what I know, only in that family. So we hardcode K7
# -A 31 = Athlon K7
# -A 18 = Pentium II
# -V 192 = SSE1|SSE2 (Or it takes SSE3 somehow in my machine without SSE3)
# -V 1 = No SIMD (Pentium II does not have any SSE)
# -t 0 = No threading
configureFlags = "-Fa alg -fPIC -t 0"
+ optionalString stdenv.isi686 " -b 32 -A 18 -V 1"
+ optionalString stdenv.isx86_64 " -A 31 -V 192"
+ optionalString shared " --shared "
;
buildInputs = [ gfortran ];
# * -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";
doCheck = true;
meta = {
homepage = "http://math-atlas.sourceforge.net/";
description = "Automatically Tuned Linear Algebra Software (ATLAS)";
license = "GPL";
license = stdenv.lib.licenses.bsd3;
longDescription = ''
The ATLAS (Automatically Tuned Linear Algebra Software) project is an ongoing