Skip to content

Commit 8de26ea

Browse files
authored
Merge pull request #606 from connorjward/add-zero-kernel-cache
Add zero kernel cache
2 parents 3652924 + be843f2 commit 8de26ea

1 file changed

Lines changed: 21 additions & 14 deletions

File tree

‎pyop2/base.py‎

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1338,13 +1338,16 @@ class Dat(DataCarrier, _EmptyDataMixin):
13381338
multiplication / division by a scalar.
13391339
"""
13401340

1341+
_zero_kernels = {}
1342+
"""Class-level cache for zero kernels."""
1343+
1344+
_modes = [READ, WRITE, RW, INC, MIN, MAX]
1345+
13411346
@cached_property
13421347
def pack(self):
13431348
from pyop2.codegen.builder import DatPack
13441349
return DatPack
13451350

1346-
_modes = [READ, WRITE, RW, INC, MIN, MAX]
1347-
13481351
@validate_type(('dataset', (DataCarrier, DataSet, Set), DataSetTypeError),
13491352
('name', str, NameTypeError))
13501353
@validate_dtype(('dtype', None, DataTypeError))
@@ -1546,18 +1549,22 @@ def zero(self, subset=None):
15461549
loop = loops.get(iterset, None)
15471550

15481551
if loop is None:
1549-
import islpy as isl
1550-
import pymbolic.primitives as p
1551-
1552-
inames = isl.make_zero_and_vars(["i"])
1553-
domain = (inames[0].le_set(inames["i"])) & (inames["i"].lt_set(inames[0] + self.cdim))
1554-
x = p.Variable("dat")
1555-
i = p.Variable("i")
1556-
insn = loopy.Assignment(x.index(i), 0, within_inames=frozenset(["i"]))
1557-
data = loopy.GlobalArg("dat", dtype=self.dtype, shape=(self.cdim,))
1558-
knl = loopy.make_function([domain], [insn], [data], name="zero")
1559-
1560-
knl = _make_object('Kernel', knl, 'zero')
1552+
try:
1553+
knl = self._zero_kernels[(self.dtype, self.cdim)]
1554+
except KeyError:
1555+
import islpy as isl
1556+
import pymbolic.primitives as p
1557+
1558+
inames = isl.make_zero_and_vars(["i"])
1559+
domain = (inames[0].le_set(inames["i"])) & (inames["i"].lt_set(inames[0] + self.cdim))
1560+
x = p.Variable("dat")
1561+
i = p.Variable("i")
1562+
insn = loopy.Assignment(x.index(i), 0, within_inames=frozenset(["i"]))
1563+
data = loopy.GlobalArg("dat", dtype=self.dtype, shape=(self.cdim,))
1564+
knl = loopy.make_function([domain], [insn], [data], name="zero")
1565+
1566+
knl = _make_object('Kernel', knl, 'zero')
1567+
self._zero_kernels[(self.dtype, self.cdim)] = knl
15611568
loop = _make_object('ParLoop', knl,
15621569
iterset,
15631570
self(WRITE))

0 commit comments

Comments
 (0)