[pypy-commit] extradoc extradoc: numpy versions of these benchmarks
hakanardo
noreply at buildbot.pypy.org
Fri Nov 21 09:51:30 CET 2014
Author: Hakan Ardo <hakan at debian.org>
Branch: extradoc
Changeset: r5464:0fbd61901330
Date: 2014-11-21 09:50 +0100
http://bitbucket.org/pypy/extradoc/changeset/0fbd61901330/
Log: numpy versions of these benchmarks
diff --git a/talk/dls2012/benchmarks/benchmark.sh b/talk/dls2012/benchmarks/benchmark.sh
--- a/talk/dls2012/benchmarks/benchmark.sh
+++ b/talk/dls2012/benchmarks/benchmark.sh
@@ -59,13 +59,21 @@
#$* ./runner.py $EXTRA_OPTS convolution/convolution.py conv3 1
#$* ./runner.py $EXTRA_OPTS convolution/convolution.py conv5 1
$* ./runner.py $EXTRA_OPTS convolution/convolution.py conv3 100
+ $* ./runner.py $EXTRA_OPTS convolution/convolution.py conv3_numpy 100
$* ./runner.py $EXTRA_OPTS convolution/convolution.py conv5 100
+ $* ./runner.py $EXTRA_OPTS convolution/convolution.py conv5_numpy 100
$* ./runner.py $EXTRA_OPTS convolution/convolution.py conv3 1000
+ $* ./runner.py $EXTRA_OPTS convolution/convolution.py conv3_numpy 1000
$* ./runner.py $EXTRA_OPTS convolution/convolution.py conv5 1000
+ $* ./runner.py $EXTRA_OPTS convolution/convolution.py conv5_numpy 1000
$* ./runner.py $EXTRA_OPTS convolution/convolution.py conv3x3 1000000 3
+ $* ./runner.py $EXTRA_OPTS convolution/convolution.py conv3x3_numpy 1000000 3
$* ./runner.py $EXTRA_OPTS convolution/convolution.py conv3x3 1000 1000
+ $* ./runner.py $EXTRA_OPTS convolution/convolution.py conv3x3_numpy 1000 1000
$* ./runner.py $EXTRA_OPTS convolution/convolution.py dilate3x3 1000 1000
+ $* ./runner.py $EXTRA_OPTS convolution/convolution.py dilate3x3_numpy 1000 1000
$* ./runner.py $EXTRA_OPTS convolution/convolution.py sobel_magnitude 1000 1000
+ $* ./runner.py $EXTRA_OPTS convolution/convolution.py sobel_magnitude_numpy 1000 1000
#$* ./runner.py $EXTRA_OPTS image/noborder.py main NoBorderImagePadded
#$* ./runner.py $EXTRA_OPTS image/noborder.py main NoBorderImagePadded iter
#$* ./runner.py $EXTRA_OPTS image/noborder.py main NoBorderImagePadded range
diff --git a/talk/dls2012/benchmarks/convolution/convolution.py b/talk/dls2012/benchmarks/convolution/convolution.py
--- a/talk/dls2012/benchmarks/convolution/convolution.py
+++ b/talk/dls2012/benchmarks/convolution/convolution.py
@@ -1,5 +1,13 @@
from array import array
from math import log10, sqrt
+try:
+ import numpy as np
+except ImportError:
+ try:
+ import numpypy as np
+ except ImportError:
+ print "Cant find nympy"
+
def _conv3(a, k, n=1):
assert len(k)==3
@@ -14,7 +22,22 @@
n = int(args[0])
_conv3(array('d', [1]) * (100000000/n),
array('d', [-1, 0, 1]), n)
- return 'conv3(array(1e%d))' % log10(100000000/n)
+ return 'conv3(array.array(1e%d))' % log10(100000000/n)
+
+def _conv3_numpy(a, k, n=1):
+ assert len(k)==3
+ b = np.zeros(len(a) - 2, a.dtype)
+ while n:
+ n -= 1
+ for i in xrange(len(b)):
+ b[i] = k[2]*a[i] + k[1]*a[i+1] + k[0]*a[i+2]
+ return b
+
+def conv3_numpy(args):
+ n = int(args[0])
+ _conv3_numpy(np.ones(100000000/n, 'd'),
+ np.array([-1, 0, 1], 'd'), n)
+ return 'conv3(numpy.array(1e%d))' % log10(100000000/n)
def _conv5(a, k, n=1):
assert len(k)==5
@@ -29,7 +52,22 @@
n = int(args[0])
_conv5(array('d', [1]) * (100000000/n),
array('d', [1, 4, 6, 4, 1]), n)
- return 'conv5(array(1e%d))' % log10(100000000/n)
+ return 'conv5(array.array(1e%d))' % log10(100000000/n)
+
+def _conv5_numpy(a, k, n=1):
+ assert len(k)==5
+ b = np.zeros(len(a) - 4, a.dtype)
+ while n:
+ n -= 1
+ for i in xrange(len(b)):
+ b[i] = k[4]*a[i] + k[3]*a[i+1] + k[2]*a[i+2] + k[1]*a[i+3] + k[0]*a[i+4]
+ return b
+
+def conv5_numpy(args):
+ n = int(args[0])
+ _conv5_numpy(np.ones(100000000/n, 'd'),
+ np.array([1, 4, 6, 4, 1], 'd'), n)
+ return 'conv5(numpy.array(1e%d))' % log10(100000000/n)
class Array2D(object):
def __init__(self, w, h, data=None):
@@ -71,13 +109,16 @@
def __init__(self, w, h):
self.width = w
self.height = h
- import numpypy
- self.data = numpypy.zeros([h, w], 'd')
+ self.data = np.zeros([h, w], 'd')
def __getitem__(self, (x, y)):
+ if x < 0 or y < 0:
+ raise IndexError
return self.data[y, x]
def __setitem__(self, (x, y), val):
+ if x < 0 or y < 0:
+ raise IndexError
self.data[y, x] = val
def _conv3x3(a, b, k):
@@ -125,6 +166,13 @@
_dilate3x3(a, b, Array2D(3,3))
return 'dilate3x3(Array2D(%sx%s))' % tuple(args)
+def dilate3x3_numpy(args):
+ a = NumpyArray(int(args[0]), int(args[1]))
+ b = NumpyArray(a.width, a.height)
+ for i in range(10):
+ _dilate3x3(a, b, NumpyArray(3,3))
+ return 'dilate3x3(NumpyArray(%sx%s))' % tuple(args)
+
def _sobel_magnitude(a):
b = Array2D(a.width, a.height)
for y in xrange(1, a.height-1):
@@ -141,3 +189,8 @@
for i in range(10):
_sobel_magnitude(Array2D(int(args[0]), int(args[1])))
return 'sobel(Array2D(%sx%s))' % tuple(args)
+
+def sobel_magnitude_numpy(args):
+ for i in range(10):
+ _sobel_magnitude(NumpyArray(int(args[0]), int(args[1])))
+ return 'sobel(NumpyArray(%sx%s))' % tuple(args)
diff --git a/talk/dls2012/benchmarks/iter/ndindex.py b/talk/dls2012/benchmarks/iter/ndindex.py
new file mode 100644
--- /dev/null
+++ b/talk/dls2012/benchmarks/iter/ndindex.py
@@ -0,0 +1,145 @@
+from numpy import ndindex, array, ones, tile
+
+range1 = range2 = ndindex
+
+def _sum1d(a):
+ sa = 0
+ for i, in range1(len(a)):
+ sa += a[i]
+
+def _xsum1d(a):
+ sa = 0
+ for i, in range1(len(a)):
+ sa += a[i] + i
+
+def _wsum1d(a):
+ sa = 0
+ for i, in range1(len(a)):
+ sa += a[i] + len(a)
+
+def _sum2d(a, w, h):
+ sa = 0
+ for x, y in range2(w, h):
+ sa += a[y, x]
+
+def _wsum2d(a, w, h):
+ sa = 0
+ for x, y in range2(w, h):
+ sa += a[y, x] + w
+
+def _xsum2d(a, w, h):
+ sa = 0
+ for x, y in range2(w, h):
+ sa += a[y, x] + x
+
+def _whsum2d(a, w, h):
+ sa = 0
+ for x, y in range2(w, h):
+ sa += a[y, x] + w + h
+
+def _xysum2d(a, w, h):
+ sa = 0
+ for x, y in range2(w, h):
+ sa += a[y, x] + x + y
+
+def _mean1d(a):
+ sa = 0
+ for i, in range1(len(a)):
+ sa = (i*sa + a[i])/(i + 1.0);
+
+def _median1d(a):
+ sa = 0
+ for i, in range1(len(a)):
+ if sa > a[i]:
+ sa -= 1.0/(i + 1.0)
+ elif sa < a[i]:
+ sa += 1.0/(i + 1.0)
+
+def _ripple1d(a):
+ sa = 0
+ for i, in range1(len(a)):
+ if sa > a[i]:
+ sa -= 0.1
+ elif sa < a[i]:
+ sa += 0.1
+
+def _ripple2d(a, w, h):
+ sa = 0
+ for x, y in range2(w, h):
+ if sa > a[y, x]:
+ sa -= 0.1
+ elif sa < a[y, x]:
+ sa += 0.1
+
+def sum1d(args):
+ run1d(args, _sum1d)
+ return "sum1d"
+
+def xsum1d(args):
+ run1d(args, _xsum1d)
+ return "xsum1d"
+
+def wsum1d(args):
+ run1d(args, _wsum1d)
+ return "wsum1d"
+
+def sum2d(args):
+ run2d(args, _sum2d)
+ return "sum2d"
+
+def wsum2d(args):
+ run2d(args, _wsum2d)
+ return "wsum2d"
+
+def xsum2d(args):
+ run2d(args, _xsum2d)
+ return "xsum2d"
+
+def whsum2d(args):
+ run2d(args, _whsum2d)
+ return "whsum2d"
+
+def xysum2d(args):
+ run2d(args, _xysum2d)
+ return "xysum2d"
+
+def mean1d(args):
+ run1d(args, _mean1d, [1, -1])
+ return "mean1d"
+
+def median1d(args):
+ run1d(args, _median1d, [1, -1])
+ return "median1d"
+
+def ripple1d(args):
+ run1d(args, _ripple1d, [1, -1])
+ return "ripple1d"
+
+def ripple2d(args):
+ run2d(args, _ripple2d, [1, -1])
+ return "ripple2d"
+
+def run1d(args, f, data=None):
+ if data:
+ a = tile(array(data), 100000000/len(data))
+ else:
+ a = ones(100000000)
+ n = int(args[0])
+ for i in xrange(n):
+ f(a)
+ return "sum1d"
+
+def run2d(args, f, data=None):
+ if data:
+ a = tile(array(data), 100000000/len(data)).reshape((10000, 10000))
+ else:
+ a = ones(100000000).reshape((10000, 10000))
+ n = int(args[0])
+ for i in xrange(n):
+ f(a, 10000, 10000)
+ return "sum1d"
+
+if __name__ == '__main__':
+ import sys
+ eval(sys.argv[1])(sys.argv[2:])
+
diff --git a/talk/dls2012/benchmarks/iter/nditer.py b/talk/dls2012/benchmarks/iter/nditer.py
new file mode 100644
--- /dev/null
+++ b/talk/dls2012/benchmarks/iter/nditer.py
@@ -0,0 +1,166 @@
+from numpy import nditer, array, ones, tile
+
+def _sum1d(a):
+ sa = 0
+ it = nditer(a, flags=['f_index'])
+ for v in it:
+ i = it.index
+ sa += a[i]
+
+def _xsum1d(a):
+ sa = 0
+ it = nditer(a, flags=['f_index'])
+ for v in it:
+ i = it.index
+ sa += a[i] + i
+
+def _wsum1d(a):
+ sa = 0
+ it = nditer(a, flags=['f_index'])
+ for v in it:
+ i = it.index
+ sa += a[i] + len(a)
+
+def _sum2d(a, w, h):
+ sa = 0
+ it = nditer(a, flags=['multi_index'])
+ for v in it:
+ y, x = it.multi_index
+ sa += a[y, x]
+
+def _wsum2d(a, w, h):
+ sa = 0
+ it = nditer(a, flags=['multi_index'])
+ for v in it:
+ y, x = it.multi_index
+ sa += a[y, x] + w
+
+def _xsum2d(a, w, h):
+ sa = 0
+ it = nditer(a, flags=['multi_index'])
+ for v in it:
+ y, x = it.multi_index
+ sa += a[y, x] + x
+
+def _whsum2d(a, w, h):
+ sa = 0
+ it = nditer(a, flags=['multi_index'])
+ for v in it:
+ y, x = it.multi_index
+ sa += a[y, x] + w + h
+
+def _xysum2d(a, w, h):
+ sa = 0
+ it = nditer(a, flags=['multi_index'])
+ for v in it:
+ y, x = it.multi_index
+ sa += a[y, x] + x + y
+
+def _mean1d(a):
+ sa = 0
+ it = nditer(a, flags=['f_index'])
+ for v in it:
+ i = it.index
+ sa = (i*sa + a[i])/(i + 1.0);
+
+def _median1d(a):
+ sa = 0
+ it = nditer(a, flags=['f_index'])
+ for v in it:
+ i = it.index
+ if sa > a[i]:
+ sa -= 1.0/(i + 1.0)
+ elif sa < a[i]:
+ sa += 1.0/(i + 1.0)
+
+def _ripple1d(a):
+ sa = 0
+ it = nditer(a, flags=['f_index'])
+ for v in it:
+ i = it.index
+ if sa > a[i]:
+ sa -= 0.1
+ elif sa < a[i]:
+ sa += 0.1
+
+def _ripple2d(a, w, h):
+ sa = 0
+ it = nditer(a, flags=['multi_index'])
+ for v in it:
+ y, x = it.multi_index
+ if sa > a[y, x]:
+ sa -= 0.1
+ elif sa < a[y, x]:
+ sa += 0.1
+
+def sum1d(args):
+ run1d(args, _sum1d)
+ return "sum1d"
+
+def xsum1d(args):
+ run1d(args, _xsum1d)
+ return "xsum1d"
+
+def wsum1d(args):
+ run1d(args, _wsum1d)
+ return "wsum1d"
+
+def sum2d(args):
+ run2d(args, _sum2d)
+ return "sum2d"
+
+def wsum2d(args):
+ run2d(args, _wsum2d)
+ return "wsum2d"
+
+def xsum2d(args):
+ run2d(args, _xsum2d)
+ return "xsum2d"
+
+def whsum2d(args):
+ run2d(args, _whsum2d)
+ return "whsum2d"
+
+def xysum2d(args):
+ run2d(args, _xysum2d)
+ return "xysum2d"
+
+def mean1d(args):
+ run1d(args, _mean1d, [1, -1])
+ return "mean1d"
+
+def median1d(args):
+ run1d(args, _median1d, [1, -1])
+ return "median1d"
+
+def ripple1d(args):
+ run1d(args, _ripple1d, [1, -1])
+ return "ripple1d"
+
+def ripple2d(args):
+ run2d(args, _ripple2d, [1, -1])
+ return "ripple2d"
+
+def run1d(args, f, data=None):
+ if data:
+ a = tile(array(data), 100000000/len(data))
+ else:
+ a = ones(100000000)
+ n = int(args[0])
+ for i in xrange(n):
+ f(a)
+ return "sum1d"
+
+def run2d(args, f, data=None):
+ if data:
+ a = tile(array(data), 100000000/len(data)).reshape((10000, 10000))
+ else:
+ a = ones(100000000).reshape((10000, 10000))
+ n = int(args[0])
+ for i in xrange(n):
+ f(a, 10000, 10000)
+ return "sum1d"
+
+if __name__ == '__main__':
+ import sys
+ eval(sys.argv[1])(sys.argv[2:])
diff --git a/talk/dls2012/benchmarks/iter/result-2.4.0.txt b/talk/dls2012/benchmarks/iter/result-2.4.0.txt
new file mode 100644
--- /dev/null
+++ b/talk/dls2012/benchmarks/iter/result-2.4.0.txt
@@ -0,0 +1,90 @@
+gcc -O3
+sum1d: 0.83 +- 1.24126707662e-16
+sum2d: 0.83 +- 1.24126707662e-16
+whsum2d: 0.842 +- 0.004472135955
+3wsum1d: 0.836 +- 0.00894427191
+wsum2d: 0.85 +- 0.0308220700148
+xsum1d: 0.842 +- 0.004472135955
+xsum2d: 0.842 +- 0.004472135955
+xysum2d: 1.12 +- 0.0346410161514
+mean1d: 7.428 +- 0.0294957624075
+median1d: 3.818 +- 0.004472135955
+ripple1d: 1.342 +- 0.0109544511501
+ripple2d: 1.336 +- 0.00894427191
+
+pypy iter/generator.py
+sum1d: 5.53084101677 +- 0.00651376226379
+sum2d: 5.7555460453 +- 0.00951369332241
+whsum2d: 5.8612534523 +- 0.0505271222339
+wsum1d: 5.13269457817 +- 0.0823542879822
+wsum2d: 5.99619159698 +- 0.0487867098222
+xsum1d: 5.04685320854 +- 0.0555180883435
+xsum2d: 6.07883496284 +- 0.0389639282491
+xysum2d: 5.83931522369 +- 0.0576320488093
+mean1d: 8.94375824928 +- 0.0108197222492
+median1d: 10.4045877457 +- 0.0285781258496
+ripple1d: 10.2467153549 +- 0.00567696790862
+ripple2d: 11.1841029644 +- 0.139083424095
+
+pypy iter/generator2.py
+sum1d: 5.9797270298 +- 0.0755165051781
+sum2d: 5.80511965752 +- 0.380443555753
+whsum2d: 6.19872779846 +- 0.0262446391517
+wsum1d: 5.0686296463 +- 0.03220581952
+wsum2d: 6.22603621483 +- 0.0765020459155
+xsum1d: 5.03696541786 +- 0.0313417312818
+xsum2d: 6.64942345619 +- 0.0634006175674
+xysum2d: 5.85069346428 +- 0.024646797031
+mean1d: 9.20232362747 +- 0.27107580199
+median1d: 10.5072529793 +- 0.0780365503085
+ripple1d: 10.3291498184 +- 0.0457349492366
+ripple2d: 12.1278275967 +- 0.0184532784891
+
+pypy iter/iterator.py
+sum1d: 2.89783701897 +- 0.0338818402654
+sum2d: 6.21735162735 +- 0.0305362100956
+whsum2d: 5.78359918594 +- 0.0418847806897
+wsum1d: 2.90417222977 +- 0.00550225146282
+wsum2d: 6.1562063694 +- 0.0248465945318
+xsum1d: 3.15220880508 +- 0.0238542345497
+xsum2d: 6.17962999344 +- 0.00522105603458
+xysum2d: 6.54959263802 +- 0.0204275708962
+mean1d: 8.9222530365 +- 0.0569358104413
+median1d: 9.32725701332 +- 0.0118218937952
+ripple1d: 7.84541239738 +- 0.0128802667437
+ripple2d: 11.0337635994 +- 0.0381211395066
+
+pypy iter/range.py
+sum1d: 1.5154399395 +- 0.00218717543831
+sum2d: 1.78169260025 +- 0.0031213150465
+whsum2d: 1.78300223351 +- 0.00343094840578
+wsum1d: 1.51814541817 +- 0.00407496519924
+wsum2d: 1.78870997429 +- 0.0102636422345
+xsum1d: 1.78627576828 +- 0.0141348129086
+xsum2d: 2.04741225243 +- 0.00739649010433
+xysum2d: 2.04407844543 +- 0.00160511612186
+mean1d: 8.38623380661 +- 0.00678559642762
+median1d: 4.52713260651 +- 0.0215238656358
+ripple1d: 3.50191493034 +- 0.0344265982872
+ripple2d: 4.24880318642 +- 0.00425382282478
+
+pypy iter/while.py
+sum1d: 0.987529802322 +- 0.00129671178469
+sum2d: 1.75787782669 +- 0.00201957281403
+whsum2d: 1.75991163254 +- 0.000927917277915
+wsum1d: 0.989894151688 +- 0.00303482111217
+wsum2d: 1.76429200172 +- 0.00496186597436
+xsum1d: 1.23868374825 +- 0.00168004472652
+xsum2d: 2.0280834198 +- 0.00263820277497
+xysum2d: 2.02464160919 +- 0.00174334572372
+mean1d: 8.34133095741 +- 0.0121082272197
+median1d: 4.27610282898 +- 0.0313133386645
+ripple1d: 2.98665003777 +- 0.0134154060239
+ripple2d: 4.04827785492 +- 0.055327379039
+
+pypy iter/ndindex.py
+NotImplementedError: unable to create dtype from objects, "DummyArray" instance not supported
+
+pypy iter/nditer.py
+sum1d: 61.2064362049 +- 0.578041254203
+sum2d: 71.1426748753 +- 1.09482960038
diff --git a/talk/dls2012/benchmarks/runall.sh b/talk/dls2012/benchmarks/runall.sh
--- a/talk/dls2012/benchmarks/runall.sh
+++ b/talk/dls2012/benchmarks/runall.sh
@@ -1,6 +1,8 @@
#!/bin/bash
#./benchmark.sh pypy
+./benchmark.sh pypy-2.4.0
+./benchmark.sh pypy-2.0
#./benchmark.sh pypy --jit enable_opts=intbounds:rewrite:virtualize:string:earlyforce:pure:heap:ffi
#./benchmark.sh pypy-1.5
#./benchmark.sh pypy-1.5 --jit enable_opts=intbounds:rewrite:virtualize:heap:unroll
@@ -8,10 +10,11 @@
#./benchmark.sh gcc
#./benchmark.sh gcc -O2
#./benchmark.sh gcc -O3 -march=native -fno-tree-vectorize
+./benchmark.sh gcc -O3 -march=native
#./benchmark.sh python2.7
#./benchmark.sh python2.6 psyco-wrapper.py
#./benchmark.sh luajit-2.0.0-beta10
#./benchmark.sh luajit-2.0.0-beta10 -O-loop
./benchmark.sh luajit
-./benchmark.sh luajit -O-loop
+#./benchmark.sh luajit -O-loop
#./benchmark.sh luajit
diff --git a/talk/dls2012/benchmarks/runiter.sh b/talk/dls2012/benchmarks/runiter.sh
--- a/talk/dls2012/benchmarks/runiter.sh
+++ b/talk/dls2012/benchmarks/runiter.sh
@@ -10,7 +10,7 @@
for p in iter/*.py; do
echo pypy $p
for b in $BENCHMARKS; do
- /tmp/pypy-trunk ./runner.py -n 5 $p $b 10
+ pypy ./runner.py -n 5 $p $b 10
done
echo
done
\ No newline at end of file
More information about the pypy-commit
mailing list