summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrea Arteaga <andyspiros@gmail.com>2012-09-03 18:22:28 +0200
committerAndrea Arteaga <andyspiros@gmail.com>2012-09-03 18:22:28 +0200
commit7fed21ff2a634b11ce17d9b1bd71f318f6f7e28b (patch)
tree97d9cb2bfa8398cbd4f8bdcd656eac725341d87c
parentMerge branch 'master' into accuracy (diff)
downloadauto-numerical-bench-7fed21ff2a634b11ce17d9b1bd71f318f6f7e28b.tar.gz
auto-numerical-bench-7fed21ff2a634b11ce17d9b1bd71f318f6f7e28b.tar.bz2
auto-numerical-bench-7fed21ff2a634b11ce17d9b1bd71f318f6f7e28b.zip
Accuracy module: output interpreter and result storage.
-rw-r--r--accuracy/TestAccuracy.hpp58
-rw-r--r--accuracy/actions/ActionGESV.hpp7
-rw-r--r--numbench/modules/internal/accuracyBase.py59
3 files changed, 101 insertions, 23 deletions
diff --git a/accuracy/TestAccuracy.hpp b/accuracy/TestAccuracy.hpp
index b0a6cc1..a79b17a 100644
--- a/accuracy/TestAccuracy.hpp
+++ b/accuracy/TestAccuracy.hpp
@@ -5,6 +5,8 @@
#include <cmath>
#include <vector>
#include <iostream>
+#include <fstream>
+#include <cstdio>
#include "utilities/Timer.hpp"
@@ -31,28 +33,49 @@ std::vector<int> getLogSizes(
return sizes;
}
+template<typename value_t> void writeToFile(
+ const std::vector<int>& sizes,
+ const std::vector<value_t>& means,
+ const std::vector<value_t>& stds,
+ const std::string& filename
+ )
+{
+ std::ofstream fs(filename.c_str());
+ fs.precision(10);
+ const int N = sizes.size();
+
+ for(int i = 0; i < N; ++i)
+ fs << sizes[i] << " " << means[i] << " " << stds[i] << "\n";
+
+ fs.close();
+}
+
-template<
- template<class> class Action,
- typename value_t
->
-std::pair<value_t, value_t> testAccuracy(
+template< template<class> class Action, typename value_t >
+void testAccuracy(
const int& minsize = 4,
const int& maxsize = 1000,
- const unsigned& N = 100u)
+ const unsigned& N = 100u
+ )
{
- std::vector<int> sizes = getLogSizes(minsize, maxsize, N);
+ const std::string filename = Action<value_t>::fileName();
+ std::cout << "Beginning operation on file " << filename << std::endl;
+
+ const std::vector<int> sizes = getLogSizes(minsize, maxsize, N);
+ std::vector<value_t> means(N), stds(N);
+
Timer t;
- for (std::vector<int>::const_iterator i = sizes.begin(), e = sizes.end();
- i != e; ++i) {
+ for (int i = 0; i < N; ++i) {
- int size = *i;
- std::cout << " -- Size: " << size << " - " << std::flush;
+ int size = sizes[i];
+ std::printf(" -- Size %6i - ", size);
+ std::cout << std::flush;
- t.start();
int N = 0;
double e, emean = 0., e2mean = 0.;
+
+ t.start();
do {
Action<value_t> action(size, N);
action.compute();
@@ -61,15 +84,20 @@ std::pair<value_t, value_t> testAccuracy(
e2mean += e*e;
} while(++N < 100 && t.elapsed() < 1. || N < 4);
- std::cout << N << " samples - " << t.elapsed() << " seconds - ";
+ std::printf("%3i samples - %6f seconds - ", N, t.elapsed());
emean /= N;
e2mean /= N;
e2mean = std::sqrt(e2mean - emean*emean);
- std::cout << emean << " +/- " << e2mean << std::endl;
-
+ std::printf("%3e +/- %3e", emean, e2mean);
+ std::cout << std::endl;
+ means[i] = emean;
+ stds[i] = e2mean;
}
+
+ std::cout << "Writing results to file " << filename << "\n" << std::endl;
+ writeToFile(sizes, means, stds, filename);
}
#endif // TESTACCURACY_HPP
diff --git a/accuracy/actions/ActionGESV.hpp b/accuracy/actions/ActionGESV.hpp
index 454e5f6..cd73164 100644
--- a/accuracy/actions/ActionGESV.hpp
+++ b/accuracy/actions/ActionGESV.hpp
@@ -3,6 +3,7 @@
#include <vector>
#include <iostream>
+#include <string>
#include "LinearCongruential.hpp"
extern "C" {
@@ -44,7 +45,11 @@ public:
return dnrm2_(&size, &b[0], &ONE)/dnrm2_(&size, &bcopy[0], &ONE);
}
-//private:
+ static std::string fileName() {
+ return "accuracy_general_solve.dat";
+ }
+
+private:
const int size;
rangen_t rg;
storage_t A, Acopy, x, b, bcopy;
diff --git a/numbench/modules/internal/accuracyBase.py b/numbench/modules/internal/accuracyBase.py
index 92a4b28..c25e023 100644
--- a/numbench/modules/internal/accuracyBase.py
+++ b/numbench/modules/internal/accuracyBase.py
@@ -1,5 +1,5 @@
from os.path import dirname, join as pjoin
-import os, subprocess as sp
+import os, re, subprocess as sp
from numbench import benchchildren, benchconfig as cfg
from numbench.utils import alternatives as alt, benchutils as bu
@@ -24,7 +24,6 @@ def compileExe(test, libname, implementation):
test['compileenv']['LIBRARY_PATH'] = libenvc
libenvr = libenv + test['runenv'].get('LD_LIBRARY_PATH', '')
- print "\n\nLIBENV: ", libenvr, "\n\n"
test['runenv']['LD_LIBRARY_PATH'] = libenvr
# Set compile-time environment
@@ -66,6 +65,7 @@ def compileExe(test, libname, implementation):
def runExe(test, implementation, exe, args):
logdir = pjoin(test['logdir'], implementation)
+ testdir = pjoin(test['testdir'], implementation)
# Check linking
logfs = file(pjoin(logdir, 'accuracyLinking.log'), 'w')
@@ -87,7 +87,6 @@ def runExe(test, implementation, exe, args):
# Open pipe
try:
- testdir = pjoin(test['testdir'], implementation)
proc = sp.Popen(args, bufsize=1, stdout=sp.PIPE, stderr=errfs, \
env=test['runenv'], cwd=testdir)
benchchildren.append(proc)
@@ -96,11 +95,9 @@ def runExe(test, implementation, exe, args):
Print('Command line: ' + ' '.join(args))
return -1, None
- result = {}
-
# Interpret output
Print('Begin execution')
- # TODO: interpret output, store results,...
+ result = interpretOutput(proc.stdout, logfs, testdir)
proc.wait()
Print("Execution finished with return code " + str(proc.returncode))
@@ -111,12 +108,60 @@ def runExe(test, implementation, exe, args):
if errp == 0:
os.unlink(errfname)
-
# Close, return
logfs.close()
return proc.returncode, result
+def interpretOutput(stdout, logfs, testdir):
+ result = {}
+
+ operationre = 'Beginning operation on file (accuracy_(.*).dat)'
+ while True:
+ operation = None
+ while operation is None:
+ line = stdout.readline()
+ if not line:
+ break
+
+ try:
+ resfile, operation = re.match(operationre, line).groups()
+ logfs.write(line)
+ except:
+ pass
+
+ # Check is program is terminated
+ if operation is None:
+ break
+
+ result[operation] = pjoin(testdir, resfile)
+ Print(operation + " -> " + resfile)
+
+
+ # Many different sizes for each operation test
+ Print.down()
+
+ while True:
+ outline = stdout.readline()
+
+ if not outline:
+ Print.up()
+ Print('Execution error')
+ return None
+
+ logfs.write(outline)
+ logfs.flush()
+
+ if not outline.startswith(' -- Size'):
+ break
+
+ Print(outline[4:].strip())
+
+ Print.up()
+
+ return result
+
+
def runTest(self, test, implementation):
exe = compileExe(test, self.libname, implementation)[1]
runExe(test, implementation, exe, self.tests)