From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from pigeon.gentoo.org ([208.92.234.80] helo=lists.gentoo.org) by finch.gentoo.org with esmtp (Exim 4.60) (envelope-from ) id 1QpO7K-00071e-T1 for garchives@archives.gentoo.org; Fri, 05 Aug 2011 17:23:28 +0000 Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id 8B0DF21C17F; Fri, 5 Aug 2011 17:23:17 +0000 (UTC) Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) by pigeon.gentoo.org (Postfix) with ESMTP id 5052B21C200 for ; Fri, 5 Aug 2011 17:23:17 +0000 (UTC) Received: from pelican.gentoo.org (unknown [66.219.59.40]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id 983C11B4021 for ; Fri, 5 Aug 2011 17:23:16 +0000 (UTC) Received: from localhost.localdomain (localhost [127.0.0.1]) by pelican.gentoo.org (Postfix) with ESMTP id EAEF180040 for ; Fri, 5 Aug 2011 17:23:15 +0000 (UTC) From: "Andrea Arteaga" To: gentoo-commits@lists.gentoo.org Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "Andrea Arteaga" Message-ID: Subject: [gentoo-commits] proj/auto-numerical-bench:unstable commit in: / X-VCS-Repository: proj/auto-numerical-bench X-VCS-Files: metis.py testdescr.py X-VCS-Directories: / X-VCS-Committer: spiros X-VCS-Committer-Name: Andrea Arteaga X-VCS-Revision: c103439560e69536ed281066867672b92b4e5949 Date: Fri, 5 Aug 2011 17:23:15 +0000 (UTC) Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: quoted-printable X-Archives-Salt: X-Archives-Hash: 8648e00c45bb946093fc2d64e843b73f commit: c103439560e69536ed281066867672b92b4e5949 Author: Andrea Arteaga gmail com> AuthorDate: Fri Aug 5 17:22:58 2011 +0000 Commit: Andrea Arteaga gmail com> CommitDate: Fri Aug 5 17:22:58 2011 +0000 URL: http://git.overlays.gentoo.org/gitweb/?p=3Dproj/auto-numerica= l-bench.git;a=3Dcommit;h=3Dc1034395 Implemented METIS tests (pmetis, kmetis). --- metis.py | 162 ++++++++++++++++++++++++++++++++++++++++++++++++++++= ++++++ testdescr.py | 10 +++- 2 files changed, 170 insertions(+), 2 deletions(-) diff --git a/metis.py b/metis.py new file mode 100644 index 0000000..c65d8a8 --- /dev/null +++ b/metis.py @@ -0,0 +1,162 @@ +import os, shlex, numpy as np, subprocess as sp +from os.path import realpath, exists as pexists, join as pjoin +from random import randint + +import basemodule +import benchconfig as cfg +from benchutils import mkdir +from benchprint import Print + +inputsdir =3D pjoin(cfg.testsdir, 'metis-input') +mkdir(inputsdir) + +avail_graph =3D ['pmetis-8', 'kmetis-8', 'pmetis-64', 'kmetis-64'] +avail_mesh =3D [] +avail_matrix =3D [] + +class Module(basemodule.BaseModule): + =20 + #classmethod + def _initialize(cls): + cls.avail =3D avail_graph + avail_mesh + avail_matrix + =20 + def _parse_args(self, args): + tests =3D [] + =20 + # Parse arguments + for i in args: + if i in self.avail: + tests.append(i) + else: + raise Exception("Argument not recognized: " + i) + =20 + if len(tests) =3D=3D 0: + # If not test provided, perform all + self.tests =3D self.avail + else: + # Sort tests + self.tests =3D [i for i in self.avail if i in tests] + =20 + @staticmethod + def get_impls(*args, **kwargs): + return ('metis',) + =20 + def save_results(self, results): + basemodule.BaseModule.save_results(self, results, 'loglog', 'Sec= onds') + =20 + def getTest(self, root, impl, testdir, logdir): + t =3D MetisTest(root, testdir, logdir, self.tests) + return t + =20 + +class MetisTest: + sizes =3D None + =20 + def __init__(self, root, testdir, logdir, tests): + self.root =3D root + self.testdir =3D testdir + self.logdir =3D logdir + self.tests =3D tests + mkdir(logdir) + mkdir(testdir) + =20 + @classmethod + def _getSizes(cls): + if cls.sizes is None: + cls.sizes =3D [int(i) for i in np.logspace(3, 6, 100)] + return cls.sizes + =20 + def _generateFiles(self): + Print("Generating input files...") + # Graph + if len([i for i in self.tests if i in avail_graph]) !=3D 0: + for size in self._getSizes(): + fname =3D pjoin(inputsdir, 'input_%i.graph' % size) + if not pexists(fname): + writeGraph(size, fname) + Print("Done") + =20 + =20 + def run_test(self, changes=3D{}): + self._generateFiles() + result =3D {} + =20 + for t in [i for i in self.tests if i in avail_graph]: + Print('Doing ' + t) + Print.down() + res =3D [] + =20 + for s,size in enumerate(self._getSizes(), 1): + inputfile =3D pjoin(inputsdir, 'input_%i.graph' % size) + =20 + # Setting environment + env =3D os.environ.copy() + envpath =3D env.has_key('PATH') and env['PATH'] or '' + env['PATH'] =3D ':'.join([pjoin(self.root, p) for p in \ + ('bin', 'usr/bin')]) + ':' + envpath + envlib =3D env.has_key('LD_LIBARY_PATH') and \ + env['LD_LIBARY_PATH'] or '' + env['LD_LIBRARY_PATH'] =3D ':'.join([pjoin(self.root,p) = for p in \ + ('usr/lib', 'usr/lib64', 'usr/lib32')]) + ':' + envlib + =20 + # Get executable + exe, parts =3D t.split('-') + exe =3D pjoin(self.root, 'usr/bin', exe) + =20 + # Check dynamic linking + logf =3D file(pjoin(self.logdir, 'ldd.log'), 'w') + p =3D sp.Popen(\ + ['ldd', '-v', exe], stdout=3Dlogf, stderr=3Dsp.STDOUT,= env=3Denv + ) + p.wait() + =20 + # Execute + logname =3D pjoin(self.logdir, t + '_%i.log' % size) + cmd =3D [exe, inputfile, parts] + pr =3D sp.Popen(cmd, stdout=3Dsp.PIPE, stderr=3Dsp.STDOU= T, env=3Denv) + lines =3D pr.communicate()[0].split('\n') + =20 + # Interpret output + for i,line in enumerate(lines): + if line[:18] =3D=3D "Timing Information": + begin_timing =3D i+1 + break + =20 + lines =3D [i[:-1] for i in lines[begin_timing+1:]] + for l in lines: + if l.strip()[:13] =3D=3D "Partitioning:": + time =3D float(shlex.split(l)[1]) + break + res.append((size,time)) + Print("size: %6i %2.3f sec. (%i/%i)" % (size, time, = s, 100)) + =20 + Print.up() + =20 + # Write sizes / times to result file + resfname =3D pjoin(self.testdir, t+'.dat') + resfs =3D file(resfname, 'w') + for i in res: + print >> resfs, i[0], i[1] + resfs.close() + result[t] =3D resfname + return result + =20 + =20 +def writeGraph(size, filename): + edges =3D [[] for i in xrange(size)] + nedges =3D 0 + for e1 in xrange(len(edges)): + n =3D 0 + tot =3D randint(1, min(size / 4, 5)) + while n < tot: + e2 =3D randint(0, size - 1) + if e2 not in edges[e1] and e1 !=3D e2: + edges[e1].append(e2) + edges[e2].append(e1) + n +=3D 1 + nedges +=3D 1 + fs =3D file(filename, 'w') + print >> fs, size, nedges + for s in edges: + print >> fs, ' '.join([str(i+1) for i in s]) + fs.close() diff --git a/testdescr.py b/testdescr.py index a6f0fe4..51ad714 100644 --- a/testdescr.py +++ b/testdescr.py @@ -1,5 +1,5 @@ testdescr =3D { -# (C)BLAS =20 +# (C)BLAS 'axpy' : 'y =3D a*x + y', 'axpby' : 'y =3D a*x + b*y', 'rot': 'Apply Givens rotation', @@ -27,5 +27,11 @@ testdescr =3D { 'FFTW_1D_Forward_Measure': 'FFTW 1D Forward (Measure)', 'FFTW_1D_Backward_Measure': 'FFTW 1D Backward (Measure)', 'FFTW_1D_Forward_Estimate': 'FFTW 1D Forward (Estimate)', -'FFTW_1D_Backward_Estimate': 'FFTW 1D Backward (Estimate)' +'FFTW_1D_Backward_Estimate': 'FFTW 1D Backward (Estimate)', + +# METIS +'pmetis-8': 'Graph partitioning using pmetis - 8 partitions', +'kmetis-8': 'Graph partitioning using kmetis - 8 partitions', +'pmetis-64': 'Graph partitioning using pmetis - 64 partitions', +'kmetis-64': 'Graph partitioning using kmetis - 64 partitions', }