From 76becd301eca8908ec3069d56431a3cbe6e385f1 Mon Sep 17 00:00:00 2001 From: Tim Warburton Date: Tue, 25 Oct 2011 23:50:48 -0500 Subject: [PATCH] Add spectral-element tests. --- test/test_sem.py | 353 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 353 insertions(+) create mode 100644 test/test_sem.py diff --git a/test/test_sem.py b/test/test_sem.py new file mode 100644 index 000000000..52b7d926b --- /dev/null +++ b/test/test_sem.py @@ -0,0 +1,353 @@ +from __future__ import division + +import numpy as np +import numpy.linalg as la +import pyopencl as cl +import pyopencl.array as cl_array +import pyopencl.clrandom as cl_random +import loopy as lp + +from pyopencl.tools import pytest_generate_tests_for_pyopencl \ + as pytest_generate_tests + + + + +def make_well_conditioned_dev_matrix(queue, shape, dtype=np.float32, + order="C", ran_factor=1, id_factor=5, inc_factor=0, od=0): + if isinstance(shape, int): + shape = (shape, shape) + l = max(shape) + eye_ish = id_factor*np.eye(l, k=od) + if inc_factor: + eye_ish[np.arange(l), np.arange(l)] = inc_factor*np.arange(l) + ary = np.asarray( + ran_factor*np.random.randn(*shape) + + eye_ish[:shape[0], :shape[1]], + dtype=dtype, order=order) + + return cl_array.to_device(queue, ary) + + + + +DO_CHECK = True + +DEBUG_PREAMBLE = r""" + #pragma OPENCL EXTENSION cl_amd_printf: enable + #define MY_J (j_outer*64+j_inner_outer*16+j_inner_inner) + #define MY_I (i_outer*16+i_inner) + #define IFDIAG if (MY_I == MY_J) + #define TST(S) if (MY_J == 144 && MY_I == 16-48) \ + for (int aa = 0; aa < 16: ++ab) \ + for (int bb = 0; bb < 16: ++bb) + """ + + + + +def check_error(refsol, sol): + if not DO_CHECK: + return + + if sol.shape == 2: + norm_order = "fro" + else: + norm_order = 2 + + rel_err = la.norm(refsol-sol, norm_order)/la.norm(refsol, norm_order) + if rel_err > 1e-5 or np.isinf(rel_err) or np.isnan(rel_err): + if 1: + import matplotlib.pyplot as pt + pt.imshow(refsol-sol) + pt.colorbar() + pt.show() + elif 0: + print "---------------------------" + print "ACTUAL" + print "---------------------------" + np.set_printoptions(threshold=1000000, linewidth=200) + print sol[:16,:16] + print "---------------------------" + print "CORRECT" + print "---------------------------" + print refsol[:16,:16] + raise RuntimeError("check failed, rel err=%g" % rel_err) + + + +def test_sem(ctx_factory): + dtype = np.float32 + ctx = ctx_factory() + order = "C" + queue = cl.CommandQueue(ctx, + properties=cl.command_queue_properties.PROFILING_ENABLE) + + # n = get_suitable_size(ctx) + + # 0<=i,j,k,m<=N AND 0<=k {[i,j,k,ip,jp,kp,e,m,mp]: 0<=i,j,k,m,ip,jp,kp,mp<%d AND 0<=e {[i,j,k,e,m,mp]: 0<=i,j,k,m,mp<%d AND 0<=e {[i,j,k,ip,jp,kp,e,m,mp]: 0<=i,j,k,m,ip,jp,kp,mp<%d AND 0<=e {[i,j,k,e,m,mp]: 0<=i,j,k,m,mp<%d AND 0<=e {[i,j,k,e,m,mp]: 0<=i,j,k,m<%d AND 0<=e ur[i,j,k,e] = sum_float32(m, D[i,m]*u[m,j,k,e])", + "[|i,j,k] us[i,j,k,e] = sum_float32(m, D[j,m]*u[i,m,k,e])", + "[|i,j,k] ut[i,j,k,e] = sum_float32(m, D[k,m]*u[i,j,m,e])", + + "lap[i,j,k,e] = " + " sum_float32(m, D[m,i]*(G[0,m,j,k,e]*ur[m,j,k,e] + G[1,m,j,k,e]*us[m,j,k,e] + G[2,m,j,k,e]*ut[m,j,k,e]))" + "+ sum_float32(m, D[m,j]*(G[1,i,m,k,e]*ur[i,m,k,e] + G[3,i,m,k,e]*us[i,m,k,e] + G[4,i,m,k,e]*ut[i,m,k,e]))" + "+ sum_float32(m, D[m,k]*(G[2,i,j,m,e]*ur[i,j,m,e] + G[4,i,j,m,e]*us[i,j,m,e] + G[5,i,j,m,e]*ut[i,j,m,e]))" + ], + [ + lp.ArrayArg("u", dtype, shape=field_shape, order=order), + lp.ArrayArg("lap", dtype, shape=field_shape, order=order), + lp.ArrayArg("G", dtype, shape=(6,) + field_shape, order=order), + lp.ArrayArg("D", dtype, shape=(n, n), order=order), + lp.ScalarArg("K", np.int32, approximately=1000), + ], + name="semlap", assumptions="K>=1") + + print knl + 1/0 + + knl = lp.split_dimension(knl, "e", 16, outer_tag="g.0")#, slabs=(0, 1)) + #knl = lp.split_dimension(knl, "e_inner", 4, inner_tag="ilp") + knl = lp.tag_dimensions(knl, dict(i="l.0", j="l.1")) + #knl = lp.realize_cse(knl, "build_ur", np.float32, ["j", "k"]) + knl = lp.realize_cse(knl, "build_ur", np.float32, ["j", "k", "mp"]) + print knl + #1/0 + + kernel_gen = lp.generate_loop_schedules(knl) + kernel_gen = lp.check_kernels(kernel_gen, dict(K=1000), kill_level_min=5) + + a = make_well_conditioned_dev_matrix(queue, n, dtype=dtype, order=order) + b = make_well_conditioned_dev_matrix(queue, n, dtype=dtype, order=order) + c = cl_array.empty_like(a) + refsol = np.dot(a.get(), b.get()) + + def launcher(kernel, gsize, lsize, check): + evt = kernel(queue, gsize(), lsize(), a.data, b.data, c.data, + g_times_l=True) + + if check: + check_error(refsol, c.get()) + + return evt + + lp.drive_timing_run(kernel_gen, queue, launcher, 2*n**3) + + + + +if __name__ == "__main__": + # make sure that import failures get reported, instead of skipping the + # tests. + import pyopencl as cl + + import sys + if len(sys.argv) > 1: + exec(sys.argv[1]) + else: + from py.test.cmdline import main + main([__file__]) -- GitLab