diff --git a/loopy/target/pyopencl_execution.py b/loopy/target/pyopencl_execution.py
index a8f47adb991e331f8a473c4eb14b1ea634c7a3b1..2da25ba39ceef38a4af105913973226bd3773729 100644
--- a/loopy/target/pyopencl_execution.py
+++ b/loopy/target/pyopencl_execution.py
@@ -25,6 +25,7 @@ THE SOFTWARE.
 import six
 from six.moves import range, zip
 
+import numpy as np
 from pytools import ImmutableRecord, memoize_method
 from loopy.diagnostic import ParameterFinderWarning
 from pytools.py_codegen import (
@@ -686,8 +687,17 @@ class PyOpenCLKernelExecutor(KernelExecutorBase):
     # {{{ debugging aids
 
     def get_code(self, arg_to_dtype=None):
+        def process_dtype(dtype):
+            if isinstance(dtype, type) and issubclass(dtype, np.generic):
+                dtype = np.dtype(dtype)
+            if isinstance(dtype, np.dtype):
+                dtype = NumpyType(dtype, self.kernel.target)
+
+            return dtype
+
         if arg_to_dtype is not None:
-            arg_to_dtype = frozenset(six.iteritems(arg_to_dtype))
+            arg_to_dtype = frozenset(
+                    (k, process_dtype(v)) for k, v in six.iteritems(arg_to_dtype))
 
         kernel = self.get_typed_and_scheduled_kernel(arg_to_dtype)