Commit 12459396 authored by Stephan Seitz's avatar Stephan Seitz
Browse files

Fix #15: do not require pycuda for OpenCL execution

parent a8292b88
...@@ -1312,13 +1312,16 @@ def implement_interpolations(ast_node: ast.Node, ...@@ -1312,13 +1312,16 @@ def implement_interpolations(ast_node: ast.Node,
substitutions = {i: to_texture_map[i.symbol.interpolator].at( substitutions = {i: to_texture_map[i.symbol.interpolator].at(
[o for o in i.offsets]) for i in interpolation_accesses} [o for o in i.offsets]) for i in interpolation_accesses}
import pycuda.driver as cuda try:
for texture in substitutions.values(): import pycuda.driver as cuda
if can_use_hw_interpolation(texture): for texture in substitutions.values():
texture.filter_mode = cuda.filter_mode.LINEAR if can_use_hw_interpolation(texture):
else: texture.filter_mode = cuda.filter_mode.LINEAR
texture.filter_mode = cuda.filter_mode.POINT else:
texture.read_as_integer = True texture.filter_mode = cuda.filter_mode.POINT
texture.read_as_integer = True
except Exception:
if isinstance(ast_node, AssignmentCollection): if isinstance(ast_node, AssignmentCollection):
ast_node = ast_node.subs(substitutions) ast_node = ast_node.subs(substitutions)
import numpy as np import numpy as np
import pytest import pytest
import sympy as sp
import pystencils import pystencils
import sympy as sp
from pystencils.backends.cuda_backend import CudaBackend from pystencils.backends.cuda_backend import CudaBackend
from pystencils.backends.opencl_backend import OpenClBackend from pystencils.backends.opencl_backend import OpenClBackend
from pystencils.opencl.opencljit import make_python_function from pystencils.opencl.opencljit import make_python_function
...@@ -195,5 +195,35 @@ def test_opencl_jit_with_parameter(): ...@@ -195,5 +195,35 @@ def test_opencl_jit_with_parameter():
assert np.allclose(result_cuda, result_opencl) assert np.allclose(result_cuda, result_opencl)
if __name__ == '__main__': @pytest.mark.skipif(not HAS_OPENCL, reason="Test requires pyopencl")
test_opencl_jit() def test_without_cuda():
z, y, x = pystencils.fields("z, y, x: [20,30]")
assignments = pystencils.AssignmentCollection({
z[0, 0]: x[0, 0] * sp.log(x[0, 0] * y[0, 0])
ast = pystencils.create_kernel(assignments, target='gpu')
opencl_code = pystencils.show_code(ast, custom_backend=OpenClBackend())
x_cpu = np.random.rand(20, 30)
y_cpu = np.random.rand(20, 30)
z_cpu = np.random.rand(20, 30)
import pyopencl.array as array
ctx = cl.create_some_context(0)
queue = cl.CommandQueue(ctx)
x = array.to_device(queue, x_cpu)
y = array.to_device(queue, y_cpu)
z = array.to_device(queue, z_cpu)
opencl_kernel = make_python_function(ast, queue, ctx)
assert opencl_kernel is not None
opencl_kernel(x=x, y=y, z=z)
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment