[pypy-commit] extradoc extradoc: merge heads

bivab noreply at buildbot.pypy.org
Mon Aug 13 10:23:40 CEST 2012


Author: David Schneider <david.schneider at picle.org>
Branch: extradoc
Changeset: r4536:a934abe0bd91
Date: 2012-08-13 10:23 +0200
http://bitbucket.org/pypy/extradoc/changeset/a934abe0bd91/

Log:	merge heads

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
@@ -57,4 +57,5 @@
     $* ./runner.py $EXTRA_OPTS scimark.py SparseMatMult 1000 5000 262144
     $* ./runner.py $EXTRA_OPTS scimark.py SparseMatMult 100000 1000000 1024
     $* ./runner.py $EXTRA_OPTS scimark.py MonteCarlo 268435456
+    $* ./runner.py $EXTRA_OPTS scimark.py LU 100 4096
 fi
diff --git a/talk/iwtc11/benchmarks/convolution/convolution.py b/talk/iwtc11/benchmarks/convolution/convolution.py
--- a/talk/iwtc11/benchmarks/convolution/convolution.py
+++ b/talk/iwtc11/benchmarks/convolution/convolution.py
@@ -64,6 +64,9 @@
             for x in xrange(self.width):
                 yield x, y
 
+    def copy_data_from(self, other):
+        self.data[:] = other.data[:]
+
 class NumpyArray(Array2D):
     def __init__(self, w, h):
         self.width = w
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
@@ -59,6 +59,10 @@
         else:
             return self.dm1 * float(k);
 
+    def RandomMatrix(self, a):
+        for x, y in a.indexes():
+            a[x, y] = self.nextDouble()
+        return a
 
 class ArrayList(Array2D):
     def __init__(self, w, h, data=None):
@@ -80,6 +84,10 @@
         else:
             self.data[idx] = val
 
+    def copy_data_from(self, other):
+        for l1, l2 in zip(self.data, other.data):
+            l1[:] = l2
+
 def SOR_execute(omega, G, num_iterations):
     for p in xrange(num_iterations):
         for y in xrange(1, G.height - 1):
@@ -138,3 +146,42 @@
     MonteCarlo_integrate(n)
     return 'MonteCarlo(%d)' % n
 
+def LU_factor(A, pivot):
+    M, N = A.height, A.width
+    minMN = min(M, N)
+    for j in xrange(minMN):
+        jp = j
+        t = abs(A[j][j])
+        for i in xrange(j + 1, M):
+            ab = abs(A[i][j])
+            if ab > t:
+                jp = i
+                t = ab
+        pivot[j] = jp
+        
+        if A[jp][j] == 0:
+            raise Exception("factorization failed because of zero pivot")
+
+        if jp != j:
+            A[j], A[jp] = A[jp], A[j]
+
+        if j < M-1:
+            recp =  1.0 / A[j][j]
+            for k in xrange(j + 1, M):
+                A[k][j] *= recp
+
+        if j < minMN-1:
+            for ii in xrange(j + 1, M):
+                for jj in xrange(j + 1, N):
+                    A[ii][jj] -= A[ii][j] * A[j][jj]
+
+def LU(args):
+    N, cycles = map(int, args)
+    rnd = Random(7)
+    A = rnd.RandomMatrix(ArrayList(N, N))
+    lu = ArrayList(N, N)
+    pivot = array('i', [0]) * N
+    for i in xrange(cycles):
+        lu.copy_data_from(A)
+        LU_factor(lu, pivot)
+    return 'LU(%d, %d)' % (N, 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
@@ -220,6 +220,7 @@
             cycles *= 2;
         }
         /* approx Mflops */
+        printf("LU: N=%d, cycles=%d\n", N, cycles);
         result = LU_num_flops(N) * cycles / Stopwatch_read(Q) * 1.0e-6;
 
         Stopwatch_delete(Q);
diff --git a/talk/iwtc11/benchmarks/test_scimark.py b/talk/iwtc11/benchmarks/test_scimark.py
--- a/talk/iwtc11/benchmarks/test_scimark.py
+++ b/talk/iwtc11/benchmarks/test_scimark.py
@@ -1,4 +1,5 @@
-from scimark import SOR_execute, Array2D, ArrayList, Random, MonteCarlo_integrate
+from scimark import SOR_execute, Array2D, ArrayList, Random, MonteCarlo_integrate, LU_factor
+from array import array
 from cffi import FFI
 import os
 
@@ -11,16 +12,18 @@
 
     void SOR_execute(int M, int N,double omega, double **G, int num_iterations);
     double MonteCarlo_integrate(int Num_samples);    
+    int LU_factor(int M, int N, double **A,  int *pivot);
     """)
 C = ffi.verify("""
     #include <SOR.h>
     #include <Random.h>
     #include <MonteCarlo.h>
+    #include <LU.h>
     """, 
     extra_compile_args=['-I' + os.path.join(os.getcwd(), 'scimark')],
     extra_link_args=['-fPIC'],
     extra_objects=[os.path.join(os.getcwd(), 'scimark', f) 
-                   for f in ['SOR.c', 'Random.c', 'MonteCarlo.c']])
+                   for f in ['SOR.c', 'Random.c', 'MonteCarlo.c', 'LU.c']])
 
 class TestWithArray2D(object):
     Array = Array2D
@@ -35,9 +38,40 @@
         for x, y in b.indexes():
             assert a[y][x] == b[x, y]
 
+    def test_copy_random_matrix(self):
+        rnd_C = C.new_Random_seed(7)
+        rnd_py = Random(7)
+        c_mat = C.RandomMatrix(20, 10, rnd_C)
+        py_mat = rnd_py.RandomMatrix(self.Array(10, 20))
+        py_mat_cpy = self.Array(10, 20)
+        py_mat_cpy.copy_data_from(py_mat)
+        for x, y in py_mat.indexes():
+            assert c_mat[y][x] == py_mat[x, y] == py_mat_cpy[x, y]
+
+
 class TestWithArrayList(TestWithArray2D):
     Array = ArrayList
 
+    def test_LU(self):
+        rnd = C.new_Random_seed(7)
+        for height in [10, 20, 30]:
+            for width in [10, 20, 30]:
+                c_mat = C.RandomMatrix(height, width, rnd)
+                c_pivot = ffi.new('int []', min(width, height))
+                py_mat = self.Array(width, height, data=c_mat)
+                py_pivot = array('i', [0]) * min(width, height)
+                C.LU_factor(height, width, c_mat, c_pivot)
+                LU_factor(py_mat, py_pivot)
+
+                for a, b in zip(c_pivot, py_pivot):
+                    assert a == b
+                for x, y in py_mat.indexes():
+                    assert c_mat[y][x] == py_mat[x, y]
+
+
+
+
+
 def test_random():
     rnd_C = C.new_Random_seed(7)
     rnd_py = Random(7)


More information about the pypy-commit mailing list