From fc1b17b00c80f445e97dcb4e393ed73ad47b8e82 Mon Sep 17 00:00:00 2001
From: "Timothy A. Smith" <tasmith4@illinois.edu>
Date: Mon, 27 May 2019 23:36:28 -0500
Subject: [PATCH] move bulk of compute_flux_derivative_gpu code into test
 fixture

---
 kernel_fixtures.py | 25 +++++++++++++++++++++++++
 setup_fixtures.py  | 19 +++++++++++++++++++
 test.py            | 34 ++++------------------------------
 3 files changed, 48 insertions(+), 30 deletions(-)

diff --git a/kernel_fixtures.py b/kernel_fixtures.py
index e905363..0640e8c 100644
--- a/kernel_fixtures.py
+++ b/kernel_fixtures.py
@@ -45,3 +45,28 @@ def compute_flux_derivatives(ctx_factory, params, arrays):
             metric_jacobians=arrays.metric_jacobians,
             flux_derivatives=flux_derivatives_dev)
     return flux_derivatives_dev.get()
+
+def compute_flux_derivatives_gpu(ctx_factory, params, arrays):
+    prg = fixtures.get_gpu_transformed_weno()
+
+    queue = fixtures.get_queue(ctx_factory)
+
+    nx_halo = params.nx + params.nhalo
+    ny_halo = params.ny + params.nhalo
+    nz_halo = params.nz + params.nhalo
+
+    flux_derivatives_dev = cl.array.empty(queue, (params.nvars, params.ndim,
+        nx_halo, ny_halo, nz_halo), dtype=np.float32, order="F")
+
+    prg = prg.copy(target=lp.PyOpenCLTarget(queue.device))
+
+    if 1:
+        with open("gen-code.cl", "w") as outf:
+            outf.write(lp.generate_code_v2(prg).device_code())
+
+    prg = lp.set_options(prg, no_numpy=True)
+
+    prg(queue, nvars=params.nvars, ndim=params.ndim,
+            states=arrays.states, fluxes=arrays.fluxes, metrics=arrays.metrics,
+            metric_jacobians=arrays.metric_jacobians,
+            flux_derivatives=flux_derivatives_dev)
diff --git a/setup_fixtures.py b/setup_fixtures.py
index 9e24722..b576866 100644
--- a/setup_fixtures.py
+++ b/setup_fixtures.py
@@ -1,5 +1,7 @@
 import numpy as np
 
+import fixtures
+
 
 class FluxDerivativeParams:
     def __init__(self, nvars, ndim, nx, ny, nz):
@@ -36,3 +38,20 @@ def random_flux_derivative_arrays(params):
     metric_jacobians = random_array(nx_halo, ny_halo, nz_halo)
 
     return FluxDerivativeArrays(states, fluxes, metrics, metric_jacobians)
+
+
+def random_flux_derivative_arrays_on_device(ctx_factory, params):
+    queue = fixtures.get_queue(ctx_factory)
+
+    nvars = params.nvars
+    ndim = params.ndim
+    nx_halo = params.nx + params.nhalo
+    ny_halo = params.ny + params.nhalo
+    nz_halo = params.nz + params.nhalo
+
+    states = fixtures.f_array(queue, nvars, nx_halo, ny_halo, nz_halo)
+    fluxes = fixtures.f_array(queue, nvars, ndim, nx_halo, ny_halo, nz_halo)
+    metrics = fixtures.f_array(queue, ndim, ndim, nx_halo, ny_halo, nz_halo)
+    metric_jacobians = fixtures.f_array(queue, nx_halo, ny_halo, nz_halo)
+
+    return FluxDerivativeArrays(states, fluxes, metrics, metric_jacobians)
diff --git a/test.py b/test.py
index 00b21ef..914e029 100644
--- a/test.py
+++ b/test.py
@@ -32,41 +32,15 @@ def test_matvec(ctx_factory):
 def test_compute_flux_derivatives(ctx_factory):
     params = setup.FluxDerivativeParams(ndim=3, nvars=5, nx=10, ny=10, nz=10)
     arrays = setup.random_flux_derivative_arrays(params)
+
     kernel.compute_flux_derivatives(ctx_factory, params, arrays)
 
 
-@pytest.mark.skip("slow")
 def test_compute_flux_derivatives_gpu(ctx_factory):
-    prg = fixtures.get_gpu_transformed_weno()
-
-    queue = fixtures.get_queue(ctx_factory)
-
-    ndim = 3
-    nvars = 5
-    nx = 10
-    ny = 10
-    nz = 10
-
-    states = fixtures.f_array(queue, nvars, nx+6, ny+6, nz+6)
-    fluxes = fixtures.f_array(queue, nvars, ndim, nx+6, ny+6, nz+6)
-    metrics = fixtures.f_array(queue, ndim, ndim, nx+6, ny+6, nz+6)
-    metric_jacobians = fixtures.f_array(queue, nx+6, ny+6, nz+6)
-
-    flux_derivatives_dev = cl.array.empty(queue, (nvars, ndim, nx+6, ny+6,
-        nz+6), dtype=np.float32, order="F")
-
-    prg = prg.copy(target=lp.PyOpenCLTarget(queue.device))
-
-    if 1:
-        with open("gen-code.cl", "w") as outf:
-            outf.write(lp.generate_code_v2(prg).device_code())
-
-    prg = lp.set_options(prg, no_numpy=True)
+    params = setup.FluxDerivativeParams(ndim=3, nvars=5, nx=10, ny=10, nz=10)
+    arrays = setup.random_flux_derivative_arrays_on_device(ctx_factory, params)
 
-    prg(queue, nvars=nvars, ndim=ndim,
-            states=states, fluxes=fluxes, metrics=metrics,
-            metric_jacobians=metric_jacobians,
-            flux_derivatives=flux_derivatives_dev)
+    kernel.compute_flux_derivatives_gpu(ctx_factory, params, arrays)
 
 
 # This lets you run 'python test.py test_case(cl._csc)' without pytest.
-- 
GitLab