Skip to content

Commit 0bed987

Browse files
committed
Merge branch 'empty-ndrange-enqueue' into 'master'
Empty ndrange enqueue See merge request inducer/loopy!396
2 parents ca5909c + 9101f7e commit 0bed987

File tree

7 files changed

+48
-19
lines changed

7 files changed

+48
-19
lines changed

loopy/kernel/array.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1194,11 +1194,10 @@ def unwrap_1d_indices(idx):
11941194
else:
11951195
return idx
11961196

1197-
from pytools import indices_in_shape
11981197
return [
11991198
(unwrap_1d_indices(i),
12001199
self.name + "".join("_s%d" % sub_i for sub_i in i))
1201-
for i in indices_in_shape(sep_shape)]
1200+
for i in np.ndindex(sep_shape)]
12021201

12031202
# }}}
12041203

loopy/target/c/__init__.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,8 +251,7 @@ def generate_linearized_array(array, value):
251251

252252
assert array.offset == 0
253253

254-
from pytools import indices_in_shape
255-
for ituple in indices_in_shape(value.shape):
254+
for ituple in np.ndindex(value.shape):
256255
i = sum(i_ax * strd_ax for i_ax, strd_ax in zip(ituple, strides))
257256
data[i] = value[ituple]
258257

loopy/target/pyopencl.py

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -318,20 +318,21 @@ def __eq__(self, other):
318318

319319
if self.device is not None:
320320
assert other.device is not None
321-
return (self.device.persistent_unique_id
322-
== other.device.persistent_unique_id)
321+
return (self.device.hashable_model_and_version_identifier
322+
== other.device.hashable_model_and_version_identifier)
323323
else:
324324
assert other.device is None
325325
return True
326326

327327
def update_persistent_hash(self, key_hash, key_builder):
328328
super(PyOpenCLTarget, self).update_persistent_hash(key_hash, key_builder)
329-
key_builder.rec(key_hash, getattr(self.device, "persistent_unique_id", None))
329+
key_builder.rec(key_hash, getattr(
330+
self.device, "hashable_model_and_version_identifier", None))
330331

331332
def __getstate__(self):
332333
dev_id = None
333334
if self.device is not None:
334-
dev_id = self.device.persistent_unique_id
335+
dev_id = self.device.hashable_model_and_version_identifier
335336

336337
return {
337338
"device_id": dev_id,
@@ -354,7 +355,7 @@ def __setstate__(self, state):
354355
dev
355356
for plat in cl.get_platforms()
356357
for dev in plat.get_devices()
357-
if dev.persistent_unique_id == dev_id]
358+
if dev.hashable_model_and_version_identifier == dev_id]
358359

359360
if matches:
360361
self.device = matches[0]
@@ -643,7 +644,7 @@ def get_function_definition(self, codegen_state, codegen_result,
643644
+ ["wait_for=None", "allocator=None"])
644645

645646
from genpy import (For, Function, Suite, Import, ImportAs, Return,
646-
FromImport, If, Assign, Line, Statement as S)
647+
FromImport, Line, Statement as S)
647648
return Function(
648649
codegen_result.current_program(codegen_state).name,
649650
args,
@@ -652,11 +653,6 @@ def get_function_definition(self, codegen_state, codegen_result,
652653
ImportAs("pyopencl", "_lpy_cl"),
653654
Import("pyopencl.tools"),
654655
Line(),
655-
If("allocator is None",
656-
Assign(
657-
"allocator",
658-
"_lpy_cl_tools.DeferredAllocator(queue.context)")),
659-
Line(),
660656
] + [
661657
Line(),
662658
function_body,
@@ -731,6 +727,13 @@ def get_kernel_call(self, codegen_state, name, gsize, lsize, extra_args):
731727
from genpy import Suite, Assign, Assert, Line, Comment
732728
from pymbolic.mapper.stringifier import PREC_NONE
733729

730+
import pyopencl.version as cl_ver
731+
if cl_ver.VERSION < (2020, 2):
732+
from warnings import warn
733+
warn("Your kernel invocation will likely fail because your "
734+
"version of PyOpenCL does not support allow_empty_ndrange. "
735+
"Please upgrade to version 2020.2 or newer.")
736+
734737
# TODO: Generate finer-grained dependency structure
735738
return Suite([
736739
Comment("{{{ enqueue %s" % name),
@@ -742,7 +745,8 @@ def get_kernel_call(self, codegen_state, name, gsize, lsize, extra_args):
742745
arry_arg_code,
743746
Assign("_lpy_evt", "%(pyopencl_module_name)s.enqueue_nd_range_kernel("
744747
"queue, _lpy_knl, "
745-
"%(gsize)s, %(lsize)s, wait_for=wait_for, g_times_l=True)"
748+
"%(gsize)s, %(lsize)s, wait_for=wait_for, "
749+
"g_times_l=True, allow_empty_ndrange=True)"
746750
% dict(
747751
pyopencl_module_name=self.target.pyopencl_module_name,
748752
gsize=ecm(gsize, prec=PREC_NONE, type_context="i"),

loopy/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
else:
6161
_cgen_version = cgen.version.VERSION_TEXT
6262

63-
DATA_MODEL_VERSION = "%s-islpy%s-cgen%s-%s-v0" % (
63+
DATA_MODEL_VERSION = "%s-islpy%s-cgen%s-%s-v1" % (
6464
VERSION_TEXT, _islpy_version, _cgen_version, _git_rev)
6565

6666

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,4 @@ git+https://github.com/inducer/codepy.git
99
git+https://github.com/inducer/f2py
1010

1111
# Optional, needed for using the C preprocessor on Fortran
12-
ply>=3.6
12+
ply>=3.6

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ def write_git_revision(package_name):
9999

100100
extras_require={
101101
"pyopencl": [
102-
"pyopencl>=2015.2",
102+
"pyopencl>=2020.2",
103103
],
104104
"fortran": [
105105
# Note that this is *not* regular 'f2py2e', this is

test/test_loopy.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2859,6 +2859,33 @@ def test_non_integral_array_idx_raises():
28592859
print(lp.generate_code_v2(knl).device_code())
28602860

28612861

2862+
@pytest.mark.parametrize("tag", ["for", "l.0", "g.0", "fixed"])
2863+
def test_empty_domain(ctx_factory, tag):
2864+
ctx = ctx_factory()
2865+
queue = cl.CommandQueue(ctx)
2866+
2867+
prg = lp.make_kernel(
2868+
"{[i,j]: 0 <= i < n}",
2869+
"""
2870+
for i
2871+
c = 1
2872+
end
2873+
""")
2874+
2875+
if tag == "fixed":
2876+
prg = lp.fix_parameters(prg, n=0)
2877+
kwargs = {}
2878+
else:
2879+
prg = lp.tag_inames(prg, {"i": tag})
2880+
kwargs = {"n": 0}
2881+
2882+
prg = lp.set_options(prg, write_code=True)
2883+
c = cl.array.zeros(queue, (), dtype=np.int32)
2884+
prg(queue, c=c, **kwargs)
2885+
2886+
assert (c.get() == 0).all()
2887+
2888+
28622889
if __name__ == "__main__":
28632890
if len(sys.argv) > 1:
28642891
exec(sys.argv[1])

0 commit comments

Comments
 (0)