[pypy-commit] extradoc extradoc: added SparseMatMult benchmark
hakanardo
noreply at buildbot.pypy.org
Sun Aug 12 10:25:36 CEST 2012
Author: Hakan Ardo <hakan at debian.org>
Branch: extradoc
Changeset: r4522:1d7c4e17e6f1
Date: 2012-08-12 10:25 +0200
http://bitbucket.org/pypy/extradoc/changeset/1d7c4e17e6f1/
Log: added SparseMatMult benchmark
diff --git a/talk/iwtc11/benchmarks/benchmark.sh b/talk/iwtc11/benchmarks/benchmark.sh
--- a/talk/iwtc11/benchmarks/benchmark.sh
+++ b/talk/iwtc11/benchmarks/benchmark.sh
@@ -18,6 +18,8 @@
./runner.py -n 5 -c "$* -lstdc++" image/sobel.cc 1000 1000
./runner.py -n 5 -c "$*" scimark/run_SOR.c 100 32768
./runner.py -n 5 -c "$*" scimark/run_SOR.c 1000 256
+ ./runner.py -n 5 -c "$*" scimark/run_SparseMatMult.c 1000 5000 262144
+ ./runner.py -n 5 -c "$*" scimark/run_SparseMatMult.c 100000 1000000 1024
rm a.out
else
if [ "$1" == "python2.7" ]; then
@@ -49,4 +51,6 @@
#$* ./runner.py $EXTRA_OPTS image/sobel.py main NoBorderImagePadded uint8
$* ./runner.py $EXTRA_OPTS scimark.py SOR 100 32768
$* ./runner.py $EXTRA_OPTS scimark.py SOR 1000 256
+ $* ./runner.py $EXTRA_OPTS scimark.py SparseMatMult 1000 5000 262144
+ $* ./runner.py $EXTRA_OPTS scimark.py SparseMatMult 100000 1000000 1024
fi
diff --git a/talk/iwtc11/benchmarks/runner.py b/talk/iwtc11/benchmarks/runner.py
--- a/talk/iwtc11/benchmarks/runner.py
+++ b/talk/iwtc11/benchmarks/runner.py
@@ -29,7 +29,7 @@
except ImportError:
pass
else:
- pypyjit.set_param(trace_limit=200000)
+ pypyjit.set_param(trace_limit=200000, threshold=1039)
if args[0].endswith('.py'):
mod = py.path.local(args[0]).pyimport()
sys.stderr.write("warming up")
diff --git a/talk/iwtc11/benchmarks/scimark.py b/talk/iwtc11/benchmarks/scimark.py
--- a/talk/iwtc11/benchmarks/scimark.py
+++ b/talk/iwtc11/benchmarks/scimark.py
@@ -1,4 +1,5 @@
from convolution.convolution import Array2D
+from array import array
def SOR_execute(omega, G, num_iterations):
for p in xrange(num_iterations):
@@ -12,3 +13,35 @@
SOR_execute(1.25, a, cycles)
return "SOR(%d, %d)" % (n, cycles)
+
+def SparseCompRow_matmult(M, y, val, row, col, x, num_iterations):
+ for reps in xrange(num_iterations):
+ for r in xrange(M):
+ sa = 0.0
+ for i in xrange(row[r], row[r+1]):
+ sa += x[ col[i] ] * val[i]
+ y[r] = sa
+
+def SparseMatMult(args):
+ N, nz, cycles = map(int, args)
+ x = array('d', [0]) * N
+ y = array('d', [0]) * N
+ result = 0.0
+ nr = nz / N
+ anz = nr * N
+ val = array('d', [0]) * anz
+ col = array('i', [0]) * nz
+ row = array('i', [0]) * (N + 1)
+ row[0] = 0
+ for r in xrange(N):
+ rowr = row[r]
+ step = r / nr
+ row[r+1] = rowr + nr
+ if (step < 1):
+ step = 1
+ for i in xrange(nr):
+ col[rowr + i] = i * step
+ SparseCompRow_matmult(N, y, val, row, col, x, cycles);
+ return "SparseMatMult(%d, %d, %d)" % (N, nz, cycles)
+
+
diff --git a/talk/iwtc11/benchmarks/scimark/kernel.c b/talk/iwtc11/benchmarks/scimark/kernel.c
--- a/talk/iwtc11/benchmarks/scimark/kernel.c
+++ b/talk/iwtc11/benchmarks/scimark/kernel.c
@@ -170,6 +170,7 @@
cycles *= 2;
}
+ printf("SparseMatMult: N=%d, nz=%d, cycles=%d\n", N, nz, cycles);
/* approx Mflops */
result = SparseCompRow_num_flops(N, nz, cycles) /
Stopwatch_read(Q) * 1.0e-6;
diff --git a/talk/iwtc11/benchmarks/scimark/run_SparseMatMult.c b/talk/iwtc11/benchmarks/scimark/run_SparseMatMult.c
new file mode 100644
--- /dev/null
+++ b/talk/iwtc11/benchmarks/scimark/run_SparseMatMult.c
@@ -0,0 +1,50 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+
+#include "SparseCompRow.c"
+
+int main(int ac, char **av) {
+ assert(ac==4);
+ int N = atoi(av[1]);
+ int nz = atoi(av[2]);
+ int cycles = atoi(av[3]);
+
+ double *x = (double*) malloc(sizeof(double)*N); //RandomVector(N, R);
+ double *y = (double*) malloc(sizeof(double)*N);
+
+ double result = 0.0;
+
+ int nr = nz/N; /* average number of nonzeros per row */
+ int anz = nr *N; /* _actual_ number of nonzeros */
+
+
+ double *val = (double *) malloc(sizeof(double)*anz); //RandomVector(anz, R);
+ int *col = (int*) malloc(sizeof(int)*nz);
+ int *row = (int*) malloc(sizeof(int)*(N+1));
+ int r=0;
+
+ row[0] = 0;
+ for (r=0; r<N; r++)
+ {
+ /* initialize elements for row r */
+
+ int rowr = row[r];
+ int step = r/ nr;
+ int i=0;
+
+ row[r+1] = rowr + nr;
+ if (step < 1) step = 1; /* take at least unit steps */
+
+
+ for (i=0; i<nr; i++)
+ col[rowr+i] = i*step;
+
+ }
+
+ SparseCompRow_matmult(N, y, val, row, col, x, cycles);
+ fprintf(stderr, "SparseMatMult(%d, %d, %d): ", N, nz, cycles);
+ return 0;
+}
+
+
More information about the pypy-commit
mailing list