[Numpy-svn] r4489 - in branches/numpy.scons/numpy/distutils/scons: . checkers

numpy-svn at scipy.org numpy-svn at scipy.org
Thu Nov 22 03:34:13 EST 2007


Author: cdavid
Date: 2007-11-22 02:34:00 -0600 (Thu, 22 Nov 2007)
New Revision: 4489

Modified:
   branches/numpy.scons/numpy/distutils/scons/__init__.py
   branches/numpy.scons/numpy/distutils/scons/checkers/__init__.py
   branches/numpy.scons/numpy/distutils/scons/checkers/custom_checkers.py
   branches/numpy.scons/numpy/distutils/scons/checkers/perflib.py
Log:
Some perflib cleaning

Modified: branches/numpy.scons/numpy/distutils/scons/__init__.py
===================================================================
--- branches/numpy.scons/numpy/distutils/scons/__init__.py	2007-11-22 04:59:19 UTC (rev 4488)
+++ branches/numpy.scons/numpy/distutils/scons/__init__.py	2007-11-22 08:34:00 UTC (rev 4489)
@@ -4,7 +4,9 @@
 from core.extension import get_python_inc, get_pythonlib_dir
 from core.utils import isstring, rsplit
 
-from checkers import CheckCBLAS, CheckCLAPACK, CheckF77BLAS, CheckF77LAPACK
+from checkers import CheckCBLAS, CheckCLAPACK, CheckF77BLAS, CheckF77LAPACK, \
+                     IsMKL, IsATLAS, IsVeclib, IsAccelerate, IsSunperf
+
 from fortran_scons import CheckF77Verbose, CheckF77Clib, CheckF77Mangling
 
 # XXX: this is ugly, better find the mathlibs with a checker 

Modified: branches/numpy.scons/numpy/distutils/scons/checkers/__init__.py
===================================================================
--- branches/numpy.scons/numpy/distutils/scons/checkers/__init__.py	2007-11-22 04:59:19 UTC (rev 4488)
+++ branches/numpy.scons/numpy/distutils/scons/checkers/__init__.py	2007-11-22 08:34:00 UTC (rev 4489)
@@ -1 +1,2 @@
 from custom_checkers import CheckCLAPACK, CheckCBLAS, CheckF77BLAS, CheckF77LAPACK
+from perflib import IsMKL, IsATLAS, IsVeclib, IsAccelerate, IsSunperf

Modified: branches/numpy.scons/numpy/distutils/scons/checkers/custom_checkers.py
===================================================================
--- branches/numpy.scons/numpy/distutils/scons/checkers/custom_checkers.py	2007-11-22 04:59:19 UTC (rev 4488)
+++ branches/numpy.scons/numpy/distutils/scons/checkers/custom_checkers.py	2007-11-22 08:34:00 UTC (rev 4489)
@@ -1,5 +1,5 @@
 #! /usr/bin/env python
-# Last Change: Fri Nov 16 06:00 PM 2007 J
+# Last Change: Thu Nov 22 04:00 PM 2007 J
 
 # Module for custom, common checkers for numpy (and scipy)
 import sys
@@ -23,15 +23,8 @@
 # LAPACK and CLAPACK ? How to test for fortran ?
 
 def CheckCBLAS(context, autoadd = 1):
-    """This checker tries to find optimized library for cblas.
-
-    This test is pretty strong: it first detects an optimized library, and then
-    tests that a simple cblas program can be run using this lib.
-    
-    It looks for the following libs:
-        - Mac OS X: Accelerate, and then vecLib.
-        - Others: MKL, then ATLAS, then Sunperf."""
-    # XXX: rpath vs LD_LIBRARY_PATH ?
+    """This checker tries to find optimized library for cblas."""
+    libname = 'cblas'
     env = context.env
 
     def check(func, name, suplibs):
@@ -42,7 +35,7 @@
             st = check_include_and_run(context, 'CBLAS (%s)' % name, 
                                        res.cfgopts, [], cblas_src, autoadd)
             if st:
-                add_info(env, 'cblas', res)
+                add_info(env, libname, res)
             return st
 
     # If section cblas is in site.cfg, use those options. Otherwise, use default
@@ -55,25 +48,17 @@
         st = check_include_and_run(context, 'CBLAS (from site.cfg) ', cfg,
                                   [], cblas_src, autoadd)
         if st:
-            add_info(env, 'cblas', ConfigRes('cblas', cfg, found))
-        return st
+            add_info(env, libname, ConfigRes('Generic CBLAS', cfg, found))
+            return st
     else:
         if sys.platform == 'darwin':
-            # Check Accelerate
             st = check(CheckAccelerate, 'Accelerate Framework', [])
             if st:
                 return st
-
             st = check(CheckVeclib, 'vecLib Framework', [])
             if st:
                 return st
-
-            add_info(env, 'cblas', 'Def numpy implementation used')
-            return 0
-            
         else:
-            # XXX: think about how to share headers info between checkers ?
-
             # Check MKL
             st = check(CheckMKL, 'MKL', [])
             if st:
@@ -89,25 +74,20 @@
             if st:
                 return st
 
-            add_info(env, 'cblas', 'Def numpy implementation used')
-            return 0
+    add_info(env, libname, None)
+    return 0
 
 def CheckF77BLAS(context, autoadd = 1):
-    """This checker tries to find optimized library for blas (fortran F77).
-
-    This test is pretty strong: it first detects an optimized library, and then
-    tests that a simple blas program (in C) can be run using this (F77) lib.
-    
-    It looks for the following libs:
-        - Mac OS X: Accelerate, and then vecLib.
-        - Others: MKL, then ATLAS, then Sunperf."""
-    # XXX: rpath vs LD_LIBRARY_PATH ?
+    """This checker tries to find optimized library for blas (fortran F77)."""
+    libname = 'blas'
     env = context.env
 
     # Get Fortran things we need
     if not env.has_key('F77_NAME_MANGLER'):
         if not CheckF77Mangling(context):
+            add_info(env, libname, None)
             return 0
+
     func_name = env['F77_NAME_MANGLER']('sgemm')
     test_src = c_sgemm2 % {'func' : func_name}
 
@@ -119,7 +99,7 @@
             st = check_include_and_run(context, 'BLAS (%s)' % name, res.cfgopts,
                     [], test_src, autoadd)
             if st:
-                add_info(env, 'blas', res)
+                add_info(env, libname, res)
             return st
 
     # If section blas is in site.cfg, use those options. Otherwise, use default
@@ -132,8 +112,8 @@
         st = check_include_and_run(context, 'BLAS (from site.cfg) ', cfg,
                                   [], test_src, autoadd)
         if st:
-            add_info(env, 'blas', ConfigRes('blas', cfg, found))
-        return st
+            add_info(env, libname, ConfigRes('Generic BLAS', cfg, found))
+            return st
     else:
         if sys.platform == 'darwin':
             # Check Accelerate
@@ -160,8 +140,7 @@
             if st:
                 return st
 
-    # XXX: Use default values for blas
-
+    add_info(env, libname, None)
     return 0
 
 def CheckF77LAPACK(context, autoadd = 1):
@@ -173,11 +152,12 @@
     It looks for the following libs:
         - Mac OS X: Accelerate, and then vecLib.
         - Others: MKL, then ATLAS."""
+    libname = 'lapack'
     env = context.env
 
     if not env.has_key('F77_NAME_MANGLER'):
         if not CheckF77Mangling(context):
-            add_info(env, 'lapack', 'Def numpy implementation used')
+            add_info(env, 'lapack', None)
             return 0
     
     # Get the mangled name of our test function
@@ -185,6 +165,8 @@
     test_src = lapack_sgesv % sgesv_string
 
     def check(func, name, suplibs):
+        # func is the perflib checker, name the printed name for the check, and
+        # suplibs a list of libraries to link in addition.
         st, res = func(context, autoadd)
         if st:
             for lib in suplibs:
@@ -192,7 +174,7 @@
             st = check_include_and_run(context, 'LAPACK (%s)' % name, res.cfgopts,
                                        [], test_src, autoadd)
             if st:
-                add_info(env, 'lapack', res)
+                add_info(env, libname, res)
             return st
 
     # If section lapack is in site.cfg, use those options. Otherwise, use default
@@ -213,8 +195,8 @@
         st = check_include_and_run(context, 'LAPACK (from site.cfg) ', fortrancfg,
                                   [], test_src, autoadd)
         if st:
-            add_info(env, 'lapack', ConfigRes('lapack', cfg, found))
-        return st
+            add_info(env, libname, ConfigRes('Generic LAPACK', cfg, found))
+            return st
     else:
         if sys.platform == 'darwin':
             st = check(CheckAccelerate, 'Accelerate Framework', [])
@@ -224,9 +206,6 @@
             st = check(CheckVeclib, 'vecLib Framework', [])
             if st:
                 return st
-
-            add_info(env, 'lapack: def numpy implementation', opts)
-            return 0
         else:
             # Check MKL
             # XXX: handle different versions of mkl (with different names)
@@ -244,7 +223,7 @@
             if st:
                 return st
 
-    add_info(env, 'lapack', 'Def numpy implementation used')
+    add_info(env, libname, None)
     return 0
 
 def CheckCLAPACK(context, autoadd = 1):
@@ -259,6 +238,7 @@
     context.Message('Checking CLAPACK ...')
     context.Result('FIXME: not implemented yet')
     return 0
+    libname = 'clapack'
     env = context.env
 
     # If section lapack is in site.cfg, use those options. Otherwise, use default
@@ -292,30 +272,30 @@
         st = check_include_and_run(context, 'LAPACK (from site.cfg) ', fortrancfg,
                                   [], test_src, autoadd)
         if st:
-            add_info(env, 'lapack', ConfigRes('lapack', cfg, found))
+            add_info(env, libname, ConfigRes('Generic CLAPACK', cfg, found))
         return st
     else:
         if sys.platform == 'darwin':
             st, opts = CheckAccelerate(context, autoadd)
             if st:
                 if st:
-                    add_info(env, 'lapack: Accelerate', opts)
+                    add_info(env, libname, opts)
                 return st
             st, opts = CheckAccelerate(context, autoadd)
             if st:
                 if st:
-                    add_info(env, 'lapack: vecLib', opts)
+                    add_info(env, libname, opts)
                 return st
 
         else:
             # Get fortran stuff (See XXX at the top on F77 vs C)
             if not env.has_key('F77_NAME_MANGLER'):
                 if not CheckF77Mangling(context):
-		    add_info(env, 'lapack', 'Def numpy implementation used')
+                    add_info(env, libname, None)
                     return 0
             if not env.has_key('F77_LDFLAGS'):
                 if not CheckF77Clib(context):
-		    add_info(env, 'lapack', 'Def numpy implementation used')
+                    add_info(env, libname, None)
                     return 0
 
             # Get the mangled name of our test function
@@ -330,7 +310,7 @@
                 st = check_include_and_run(context, 'LAPACK (MKL)', res.cfgopts,
                                            [], test_src, autoadd)
                 if st:
-                    add_info(env, 'lapack', res)
+                    add_info(env, libname, res)
                 return st
 
             # Check ATLAS
@@ -340,7 +320,7 @@
                 st = check_include_and_run(context, 'LAPACK (ATLAS)', res.cfgopts,
                                            [], test_src, autoadd)
                 if st:
-                    add_info(env, 'lapack', res)
+                    add_info(env, libname, res)
                 # XXX: Check complete LAPACK or not. (Checking for not
                 # implemented lapack symbols ?)
                 return st
@@ -351,8 +331,8 @@
                 st = check_include_and_run(context, 'LAPACK (Sunperf)', res.cfgopts,
                                            [], test_src, autoadd)
                 if st:
-                    add_info(env, 'lapack', res)
+                    add_info(env, libname, res)
                 return st
 
-    add_info(env, 'lapack', 'Def numpy implementation used')
+    add_info(env, libname, None)
     return 0

Modified: branches/numpy.scons/numpy/distutils/scons/checkers/perflib.py
===================================================================
--- branches/numpy.scons/numpy/distutils/scons/checkers/perflib.py	2007-11-22 04:59:19 UTC (rev 4488)
+++ branches/numpy.scons/numpy/distutils/scons/checkers/perflib.py	2007-11-22 08:34:00 UTC (rev 4489)
@@ -1,5 +1,5 @@
 #! /usr/bin/env python
-# Last Change: Thu Nov 22 01:00 PM 2007 J
+# Last Change: Thu Nov 22 05:00 PM 2007 J
 
 # This module defines checkers for performances libs providing standard API,
 # such as MKL (Intel), ATLAS, Sunperf (solaris and linux), Accelerate (Mac OS
@@ -20,6 +20,82 @@
 from support import check_include_and_run, check_symbol
 from support import save_and_set, restore, ConfigOpts, ConfigRes
 
+#-------------------------------------------
+# Perflib specific configuration and helpers
+#-------------------------------------------
+class PerflibConfig:
+    def __init__(self, name, section, defopts, headers, funcs, version_checker = None):
+        """Initialize the configuration.
+
+        Args:
+            - name : str
+                the name of the perflib
+            - section : str
+                the name of the section used in site.cfg for customization
+            - defopts : ConfigOpts
+                the compilation configuration for the checker
+            - headers : list
+                the list of headers to test in the checker
+            - funcs : list
+                the list of functions to test in the checker.
+            - version_checker : callable
+                optional function to check version of the perflib. Its
+                arguments should be env and opts, where env is a scons
+                environment and opts a ConfigOpts instance. It should return an
+                integer (1 if successfull) and a version string."""
+                
+        self.name = name
+        self.section = section
+        self.defopts = defopts
+        self.headers = headers
+        self.funcs = funcs
+        self.version_checker = version_checker
+
+_CONFIG = {
+        'MKL': PerflibConfig('MKL', 'mkl', ConfigOpts(libs = ['mkl', 'guide', 'm']),
+                             ['mkl.h'], ['MKLGetVersion']),
+        'ATLAS': PerflibConfig('ATLAS', 'atlas', 
+                               ConfigOpts(libs = ['atlas'], 
+                               libpath = [pjoin(i, 'atlas') for i in 
+                                          default_lib_dirs]),
+                               ['atlas_enum.h'],
+                               ['ATL_sgemm']),
+        'Accelerate' : PerflibConfig('Framework: Accelerate', 'accelerate', 
+                                      ConfigOpts(frameworks = ['Accelerate']),
+                                      ['Accelerate/Accelerate.h'],
+                                      ['cblas_sgemm']),
+        'vecLib' : PerflibConfig('Framework: vecLib', 'vecLib', 
+                                 ConfigOpts(frameworks = ['vecLib']),
+                                 ['vecLib/vecLib.h'],
+                                 ['cblas_sgemm']),
+        'Sunperf' : PerflibConfig('Sunperf', 'sunperf', 
+                                  ConfigOpts(cflags = ['-dalign'], 
+                                             linkflags = ['-xlic_lib=sunperf']),
+                                  ['sunperf.h'],
+                                  ['cblas_sgemm'])}
+
+class IsFactory:
+    def __init__(self, name):
+        """Name should be one key of _CONFIG."""
+        try:
+            _CONFIG[name]
+        except KeyError, e:
+            raise RuntimeError("name %s is unknown")
+
+        def f(env, libname):
+            if env['NUMPY_PKG_CONFIG'][libname] is None:
+                return 0 == 1
+            else:
+                return env['NUMPY_PKG_CONFIG'][libname].name == \
+                       _CONFIG[name].name
+        self.func = f
+
+    def get_func(self):
+        return self.func
+
+#------------------------
+# Generic functionalities
+#------------------------
 def _check(context, name, section, defopts, headers_to_check, funcs_to_check, 
            check_version, version_checker, autoadd, rpath_is_libpath = True):
     """Generic implementation for perflib check.
@@ -103,6 +179,9 @@
 
     return st, cfgres
 
+#--------------
+# MKL checker
+#--------------
 def _mkl_version_checker(env, opts):
     version_code = r"""
 #include <stdio.h>
@@ -135,6 +214,17 @@
 
     return vst, version
 
+def CheckMKL(context, autoadd = 1, check_version = 0):
+    cfg = _CONFIG['MKL']
+
+    return _check(context, cfg.name, cfg.section, cfg.defopts, cfg.headers,
+                  cfg.funcs, check_version, _mkl_version_checker, autoadd)
+
+IsMKL = IsFactory('MKL').get_func()
+
+#---------------
+# ATLAS Checker
+#---------------
 def _atlas_version_checker(env, opts):
     version_code = """
 void ATL_buildinfo(void);
@@ -161,29 +251,18 @@
 
     return vst, version
 
-def CheckMKL(context, autoadd = 1, check_version = 0):
-    name    = 'MKL'
-    section = 'mkl'
-    defopts = ConfigOpts(libs = ['mkl', 'guide', 'm'])
-    headers = ['mkl.h']
-    funcs   = ['MKLGetVersion']
-
-    return _check(context, name, section, defopts, headers, funcs,
-                  check_version, _mkl_version_checker, autoadd)
-
 def CheckATLAS(context, autoadd = 1, check_version = 0):
     """Check whether ATLAS is usable in C."""
-    name    = 'ATLAS'
-    section = 'atlas'
-    defopts = ConfigOpts(libs = ['atlas'], 
-                         libpath = [pjoin(i, 'atlas') for i in 
-                                    default_lib_dirs])
-    headers = ['atlas_enum.h']
-    funcs   = ['ATL_sgemm']
-    
-    return _check(context, name, section, defopts, headers, funcs,
-                  check_version, _atlas_version_checker, autoadd)
+    cfg = _CONFIG['ATLAS']
 
+    return _check(context, cfg.name, cfg.section, cfg.defopts, cfg.headers,
+                  cfg.funcs, check_version, _atlas_version_checker, autoadd)
+
+IsATLAS = IsFactory('ATLAS').get_func()
+
+#------------------------------
+# Mac OS X Frameworks checkers
+#------------------------------
 def CheckAccelerate(context, autoadd = 1, check_version = 0):
     """Checker for Accelerate framework (on Mac OS X >= 10.3). """
     # According to
@@ -203,29 +282,25 @@
     #    is_intel = 0
     #    cflags.append('-faltivec')
 
-    name    = 'Framework: Accelerate'
-    # XXX: does it make sense to customize mac os X frameworks ?
-    section = 'accelerate'
-    defopts = ConfigOpts(frameworks = ['Accelerate'])
-    headers = ['Accelerate/Accelerate.h']
-    funcs   = ['cblas_sgemm']
-    
-    return _check(context, name, section, defopts, headers, funcs,
-                  check_version, None, autoadd)
+    cfg = _CONFIG['Accelerate']
 
+    return _check(context, cfg.name, cfg.section, cfg.defopts, cfg.headers,
+                  cfg.funcs, check_version, None, autoadd)
+
+IsAccelerate = IsFactory('Accelerate').get_func()
+
 def CheckVeclib(context, autoadd = 1, check_version = 0):
     """Checker for Veclib framework (on Mac OS X < 10.3)."""
-    name    = 'Framework: Accelerate'
-    # XXX: does it make sense to customize mac os X frameworks ?
-    section = 'accelerate'
-    defopts = ConfigOpts(frameworks = ['Accelerate'])
-    headers = ['vecLib/vecLib.h']
-    funcs   = ['cblas_sgemm']
-    
-    return _check(context, name, section, defopts, headers, funcs,
-                  check_version, None, autoadd)
+    cfg = _CONFIG['vecLib']
 
+    return _check(context, cfg.name, cfg.section, cfg.defopts, cfg.headers,
+                  cfg.funcs, check_version, None, autoadd)
 
+IsVeclib = IsFactory('vecLib').get_func()
+
+#-----------------
+# Sunperf checker
+#-----------------
 from os.path import basename, dirname
 from copy import deepcopy
 from numpy.distutils.scons.core.utils import popen_wrapper
@@ -233,16 +308,10 @@
 
 def CheckSunperf(context, autoadd = 1, check_version = 0):
     """Checker for sunperf."""
-    name    = 'Sunperf'
-    section = 'sunperf'
-    # XXX: Other options needed ?
-    defopts = ConfigOpts(cflags = ['-dalign'], linkflags = ['-xlic_lib=sunperf'])
-    headers = ['sunperf.h']
-    funcs   = ['cblas_sgemm']
+    cfg = _CONFIG['vecLib']
     
-    st, res = _check(context, name, section, defopts, headers, funcs,
-                check_version, None, autoadd)
-
+    st, res = _check(context, cfg.name, cfg.section, cfg.defopts, cfg.headers,
+                     cfg.funcs, check_version, None, autoadd)
     if not st:
         return st, res
 
@@ -342,3 +411,5 @@
         t = parse(t)
 
     return keep
+
+IsSunperf = IsFactory('Sunperf').get_func()




More information about the Numpy-svn mailing list