diff --git a/Makefile.am b/Makefile.am index 4778d852a8ba23ab084f8ef63084ced86c7b2033..9dc8439c9c30db1570f879b57bdea86d30b90d12 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = mpidep rudeconfig src utils @TESTDIR@ @EXTRAS@ doc @EXAMPLESDIR@ @PYMUSIC_SUBDIR@ +SUBDIRS = mpidep rudeconfig src utils @TESTDIR@ @EXTRAS@ doc @EXAMPLESDIR@ @MUSICCONFIGDIR@ @PYMUSIC_SUBDIR@ debdir=../@PACKAGE_NAME@-@PACKAGE_VERSION@ diff --git a/configure.ac b/configure.ac index 1d551fd389273a093935b2c193dd9853a7c80e75..c49992a170e4109fbdbb708cd2461681814df444 100644 --- a/configure.ac +++ b/configure.ac @@ -325,6 +325,7 @@ AX_CHECK_COMPILE_FLAG([-fno-strict-aliasing], # FIXME: this means that --without-python make will not recurse into pymusic subdir if test "x$have_python" = "xyes"; then + MUSICCONFIGDIR="music-config" PYMUSIC_SUBDIR="pymusic" else PYMUSIC_SUBDIR="" @@ -340,6 +341,7 @@ fi AC_SUBST([HAVE_PYTHON]) +AC_SUBST([MUSICCONFIGDIR]) AC_SUBST([PYMUSIC_SUBDIR]) AC_SUBST([PYEXECDIR], ${pyexecdir}) @@ -384,8 +386,8 @@ AC_CONFIG_FILES([ testsuite/music_tests.sh testsuite/unittests/catch/Makefile testsuite/sanitytests/Makefile - music/Makefile - music/predict_rank.py + music-config/Makefile + music-config/predict_rank.py doc/Makefile extras/Makefile ]) diff --git a/music/.gitignore b/music-config/.gitignore similarity index 100% rename from music/.gitignore rename to music-config/.gitignore diff --git a/music/ChangeLog b/music-config/ChangeLog similarity index 100% rename from music/ChangeLog rename to music-config/ChangeLog diff --git a/music/Makefile.am b/music-config/Makefile.am similarity index 85% rename from music/Makefile.am rename to music-config/Makefile.am index b5bb964ff3925cbb36a93abdc77c1a69af85929d..143220be496498c4aacb5c57273ae028868a9197 100644 --- a/music/Makefile.am +++ b/music-config/Makefile.am @@ -2,6 +2,8 @@ edit = sed -e 's|@libdir[@]|$(libdir)|g' pkgpython_PYTHON = __init__.py predict_rank.py config.py +pkgpythondir = $(pythondir)/music/config + EXTRA_DIST = predict_rank.py.in predict_rank.py: Makefile predict_rank.py.in diff --git a/music/__init__.py b/music-config/__init__.py similarity index 100% rename from music/__init__.py rename to music-config/__init__.py diff --git a/music/get_rank.py b/music-config/get_rank.py similarity index 100% rename from music/get_rank.py rename to music-config/get_rank.py diff --git a/music/predict_rank.py.in b/music-config/predict_rank.py.in similarity index 100% rename from music/predict_rank.py.in rename to music-config/predict_rank.py.in diff --git a/music/config.py b/music/config.py deleted file mode 100644 index e7a3b81722ba1f18f534d4031ec0cd8c90ceb1cd..0000000000000000000000000000000000000000 --- a/music/config.py +++ /dev/null @@ -1,250 +0,0 @@ -# -# This file is part of MUSIC. -# Copyright (C) 2012 Mikael Djurfeldt -# -# MUSIC is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# MUSIC is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -# This API allows for querying the MPI rank and specification of the -# information in MUSIC configuration files - -import os - -from music.predict_rank import predictRank - -# This function now defined in predict_rank.py -# -#def predictRank (): -# """ -# Returns the predicted MPI rank of this process -# -# :rtype: Integer -# """ -# return 0 - -CONFIGVARNAME = '_MUSIC_CONFIG_' - -OUTPUT = '0' -INPUT = '1' - - -def launchedByMusic (): - return CONFIGVARNAME in os.environ - - -def supersedeArgv (argv): - """ - Replace argc and argv before MUSIC initialization - """ - # Should insert escape characters - args = argv[0] - for arg in argv[1:]: - args += ' ' + arg - os.environ['MUSIC_ARGV'] = args - - -def postponeSetup (): - """ - Postpones processing of configuration info until the creation of - the first port. Must be called before creation of MUSIC::Setup. - """ - if not thisApp: - raise RuntimeError, \ - 'must define Application before calling postponeSetup ()' - os.environ[CONFIGVARNAME] = 'POSTPONE:' + str (thisApp.number) - - -portCodes = {} -code = 0 - -def portCode (appName, portName): - global code - key = (appName, portName) - if key in portCodes: - return portCodes[key] - portCodes[key] = code - ans = code - code += 1 - return ans - - -class ConnectivityMap (object): - def __init__ (self): - self.ports = {} - - def register (self, portName, direction, width, *connection): - if portName in self.ports: - (direction_, width_, connections) = self.ports[portName] - #*fixme* error checks here - else: - connections = [] - self.ports[portName] = (direction, width, connections) - connections.append (connection) - - def conf (self): - conf = str (len (self.ports)) - for portName in self.ports: - (direction, width, connections) = self.ports[portName] - conf += ':' + portName + ':' + direction + ':' + width - conf += ':' + str (len (connections)) - for connection in connections: - for item in connection: - conf += ':' + item - return conf - - -configDict = {} -appNumber = 0 -rankSum = 0 -thisRank = predictRank () -thisApp = None - -class Application (object): - def __init__ (self, np = None, binary = None, args = None, name = None): - global appNumber, rankSum, thisApp - self.name = name - self.number = appNumber - appNumber += 1 - self.np = np - self.leader = rankSum - rankSum += np - self.this = False - if self.leader <= thisRank and thisRank < rankSum: - self.this = True - thisApp = self - - self.configDict = {} - self.connectivityMap = ConnectivityMap () - - if binary: - self.define ('binary', binary) - if args: - self.define ('args', args) - - applicationMap.register (self) - - def __getitem__ (self, varName): - if varName in self.configDict: - return self.configDict[varName] - return configDict[varName] - - def define (self, varName, value): - """ - Define configuration variable varName to value value. - """ - self.configDict[varName] = str (value) - - def connect (self, fromPort, toApp, toPort, width): - """ - Connect fromPort to toPort. - """ - connections.append ((self, fromPort, toApp, toPort, str (width))) - - -class ApplicationMap (object): - def __init__ (self): - self.applications = [] - self.nameMap = {} - - def register (self, app): - if not app.name: - app.name = 'application' - if app.name in self.nameMap: - # Adjust the name to become unique - record = self.nameMap[app.name] - base, suffix = record - if base == app.name: - suffix += 1 - record[1] = suffix - else: - base = app.name - suffix = 0 - self.nameMap[base] = [base, suffix] - app.name += str (suffix) - else: - self.nameMap[app.name] = [app.name, 0] - self.applications.append (app) - - def conf (self): - conf = str (len (self.applications)) - for app in self.applications: - conf += ':' + app.name + ':' + str (app.np) - return conf - -applicationMap = ApplicationMap () - - -def define (varName, value): - """ - Define configuration variable varName to value value. - """ - configDict[varName] = str (value) - - -# Communication algorithms - -commAlgorithms = { 'collective' : 0, 'point-to-point' : 1 } - -# Processing methods - -procMethods = { 'tree' : 0, 'table' : 1 } - - -def connect (fromApp, fromPort, toApp, toPort, width, - commAlgName = 'collective', procMethodName = 'table'): - """ - Connect fromPort to toPort specifying port width width. - """ - width = str (width) - commAlg = commAlgorithms[commAlgName] - procMethod = procMethods[procMethodName] - fromApp.connectivityMap.register (fromPort, OUTPUT, width, - toApp.name, toPort, - str (portCode (toApp.name, toPort)), - str (toApp.leader), str (toApp.np), - str (commAlg), str (procMethod)) - toApp.connectivityMap.register (toPort, INPUT, width, - toApp.name, toPort, - str (portCode (toApp.name, toPort)), - str (fromApp.leader), str (fromApp.np), - str (commAlg), str (procMethod)) - - -configured = False - -def configure (): - """ - Configure the MUSIC library using the information provided by - define and connect. - """ - conf = thisApp.name \ - + ':' + str (thisApp.number) \ - + ':' + applicationMap.conf () \ - + ':' + thisApp.connectivityMap.conf () - - configDict.update (thisApp.configDict) - - for key in configDict: - conf += ':' + key + '=' + configDict[key] - - os.environ[CONFIGVARNAME] = conf - - configured = True - - -def launch (): - if not configured: - configure () - binary = thisApp['binary'] - os.execvp (binary, [binary] + thisApp['args'].split (' '))