@@ -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