@@ -1049,6 +1049,7 @@ def __init__(self, global_):
10491049
10501050 self ._global = global_
10511051 self ._globalset = GlobalSet (comm = self .comm )
1052+ self ._name = "gdset_#x%x" % id (self )
10521053
10531054 @classmethod
10541055 def _cache_key (cls , * args ):
@@ -1383,13 +1384,16 @@ class Dat(DataCarrier, _EmptyDataMixin):
13831384 multiplication / division by a scalar.
13841385 """
13851386
1387+ _zero_kernels = {}
1388+ """Class-level cache for zero kernels."""
1389+
1390+ _modes = [READ , WRITE , RW , INC , MIN , MAX ]
1391+
13861392 @cached_property
13871393 def pack (self ):
13881394 from pyop2 .codegen .builder import DatPack
13891395 return DatPack
13901396
1391- _modes = [READ , WRITE , RW , INC , MIN , MAX ]
1392-
13931397 @validate_type (('dataset' , (DataCarrier , DataSet , Set ), DataSetTypeError ),
13941398 ('name' , str , NameTypeError ))
13951399 @validate_dtype (('dtype' , None , DataTypeError ))
@@ -1591,18 +1595,22 @@ def zero(self, subset=None):
15911595 loop = loops .get (iterset , None )
15921596
15931597 if loop is None :
1594- import islpy as isl
1595- import pymbolic .primitives as p
1596-
1597- inames = isl .make_zero_and_vars (["i" ])
1598- domain = (inames [0 ].le_set (inames ["i" ])) & (inames ["i" ].lt_set (inames [0 ] + self .cdim ))
1599- x = p .Variable ("dat" )
1600- i = p .Variable ("i" )
1601- insn = loopy .Assignment (x .index (i ), 0 , within_inames = frozenset (["i" ]))
1602- data = loopy .GlobalArg ("dat" , dtype = self .dtype , shape = (self .cdim ,))
1603- knl = loopy .make_function ([domain ], [insn ], [data ], name = "zero" )
1604-
1605- knl = Kernel (knl , 'zero' )
1598+ try :
1599+ knl = self ._zero_kernels [(self .dtype , self .cdim )]
1600+ except KeyError :
1601+ import islpy as isl
1602+ import pymbolic .primitives as p
1603+
1604+ inames = isl .make_zero_and_vars (["i" ])
1605+ domain = (inames [0 ].le_set (inames ["i" ])) & (inames ["i" ].lt_set (inames [0 ] + self .cdim ))
1606+ x = p .Variable ("dat" )
1607+ i = p .Variable ("i" )
1608+ insn = loopy .Assignment (x .index (i ), 0 , within_inames = frozenset (["i" ]))
1609+ data = loopy .GlobalArg ("dat" , dtype = self .dtype , shape = (self .cdim ,))
1610+ knl = loopy .make_function ([domain ], [insn ], [data ], name = "zero" )
1611+
1612+ knl = Kernel (knl , 'zero' )
1613+ self ._zero_kernels [(self .dtype , self .cdim )] = knl
16061614 loop = _make_object ('ParLoop' , knl ,
16071615 iterset ,
16081616 self (WRITE ))
@@ -3415,8 +3423,8 @@ def _cache_key(cls, code, name, opts={}, include_dirs=[], headers=[],
34153423 code = code .gencode ()
34163424 if isinstance (code , loopy .LoopKernel ):
34173425 from loopy .tools import LoopyKeyBuilder
3418- from pytools . persistent_dict import new_hash
3419- key_hash = new_hash ()
3426+ from hashlib import sha256
3427+ key_hash = sha256 ()
34203428 code .update_persistent_hash (key_hash , LoopyKeyBuilder ())
34213429 code = key_hash .hexdigest ()
34223430 hashee = (str (code ) + name + str (sorted (opts .items ())) + str (include_dirs )
0 commit comments