From e7a69d9c3bb97fdaa4c1d7fb2f7e775d4247f9e6 Mon Sep 17 00:00:00 2001 From: vasiloglou Date: Fri, 21 Dec 2007 16:14:36 +0000 Subject: [PATCH] Added complex routines for blas lapack but they compile as a separate library so that it doesn't slow down applications that do not need complex routines --- fastlib/la/build.py | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/fastlib/la/build.py b/fastlib/la/build.py index 7671954b95..27b5e6d86c 100644 --- a/fastlib/la/build.py +++ b/fastlib/la/build.py @@ -6,6 +6,42 @@ wgetrule( type = Types.ANY, url = "http://www.cc.gatech.edu/~garryb/fastlib/blaspack.tgz") +wgetrule( + name = "complex_blaspack_tgz", + type = Types.ANY, + url = "http://www.cc.gatech.edu/~gtg739c/complex_blaspack.tgz") + +def gen_compile_complex_lapack(sysentry, files, params): + blaspack_tgz = files["complex_blaspack_tgz"].single(Types.ANY) + libblaspack = sysentry.file("KEEP/libcomplexblaspack.a", "arch", "kernel", "compiler") + workspace_dir = os.path.join(os.path.dirname(libblaspack.name), "libcomplexblaspack_workspace") + compiler_info = compilers[params["compiler"]] + compiler = compiler_info.compiler_program("f") + # Make sure we won't rm -rf anything bad + assert "libcomplexblaspack_workspace" in workspace_dir + sysentry.command("echo '... Extracting FORTRAN files...'") + sysentry.command("mkdir -p %s" % sq(workspace_dir)) + sysentry.command("cd %s && tar -xzf %s" % (sq(workspace_dir), sq(blaspack_tgz.name))) + sysentry.command("echo '*** Compiling COMPLEX LAPACK with BLAS reference implementation.'") + sysentry.command("echo '!!! LAPACK WARNING: For better performance, install ATLAS or Intel MKL.'") + sysentry.command("echo '... Our compilation differs slightly from regular LAPACK/BLAS:'") + sysentry.command("echo '... NOTE 2: We omit real-number routines (halves compile time).'") + sysentry.command("echo '... NOTE 3: We require case sensitivity for LAPACK/BLAS string parameters.'") + sysentry.command("echo '... This may take several minutes (about 800 FORTRAN files).'") + # Loop unrolling is not useful on modern architectures (and bloats EXE size). + # Thus, we only compile -O2. + sysentry.command("cd %s && %s -O2 -c src/*.f" % (sq(workspace_dir), sq(compiler))) + sysentry.command("echo '... Almost done with LAPACK/BLAS...'") + #noopt = "zlamch clamch" # these have to be compiled without optimization + #noopt_real = " ".join(sq(["src/%s.f" % x for x in noopt.split()])) + #sysentry.command("cd %s && %s -O0 -c %s" % (sq(workspace_dir), sq(compiler), noopt_real)) + sysentry.command("cd %s && ar r %s *.o" % (sq(workspace_dir), sq(libblaspack.name))) + sysentry.command("echo '... Created archive, cleaning up.'") + sysentry.command("rm -rf %s" % sq(workspace_dir)) + sysentry.command("echo '*** Done with LAPACK and BLAS!'") + return [(Types.LINKABLE, libblaspack)] + + def gen_compile_lapack(sysentry, files, params): blaspack_tgz = files["blaspack_tgz"].single(Types.ANY) libblaspack = sysentry.file("KEEP/libblaspack.a", "arch", "kernel", "compiler") @@ -36,6 +72,13 @@ def gen_compile_lapack(sysentry, files, params): sysentry.command("echo '*** Done with LAPACK and BLAS!'") return [(Types.LINKABLE, libblaspack)] + +customrule( + name = "libcomplexblaspack", + dependencies = {"complex_blaspack_tgz": [find(":complex_blaspack_tgz")]}, + doit_fn = gen_compile_complex_lapack) + + customrule( name = "libblaspack", dependencies = {"blaspack_tgz": [find(":blaspack_tgz")]},