@@ -39,10 +39,11 @@ def __init__(self, name, val=None):
3939TILABLE = Property ('tilable' )
4040"""A fully parallel Dimension that would benefit from tiling (or "blocking")."""
4141
42- TILABLE_SMALL = Property ('tilable* ' )
42+ NO_TUNING = Property ('notuning ' )
4343"""
44- Like TILABLE, but it would benefit from relatively small block, since the
45- iteration space is likely to be very small.
44+ A Dimension that would be unlikely to benefit from tuning. For example, the
45+ underlying iteration space is relatively small, and/or the enclosed expressions
46+ are not characterized by data reuse, etc.
4647"""
4748
4849SKEWABLE = Property ('skewable' )
@@ -115,7 +116,6 @@ def __init__(self, name, val=None):
115116
116117# Bundles
117118PARALLELS = {PARALLEL , PARALLEL_INDEP , PARALLEL_IF_ATOMIC , PARALLEL_IF_PVT }
118- TILABLES = {TILABLE , TILABLE_SMALL }
119119
120120
121121def normalize_properties (* args ):
@@ -253,16 +253,10 @@ def prefetchable(self, dims, v=PREFETCHABLE):
253253 m [d ] = self .get (d , set ()) | {v }
254254 return Properties (m )
255255
256- def block (self , dims , kind = 'default' ):
257- if kind == 'default' :
258- p = TILABLE
259- elif kind == 'small' :
260- p = TILABLE_SMALL
261- else :
262- raise ValueError
256+ def block (self , dims ):
263257 m = dict (self )
264258 for d in as_tuple (dims ):
265- m [d ] = set (self .get (d , [])) | {p }
259+ m [d ] = set (self .get (d , [])) | {TILABLE }
266260 return Properties (m )
267261
268262 def inbound (self , dims ):
@@ -289,6 +283,9 @@ def init_halo_right_shm(self, dims):
289283 INIT_HALO_LEFT_SHM })
290284 return properties
291285
286+ def notune (self , dims ):
287+ return self .add (dims , NO_TUNING )
288+
292289 def is_parallel (self , dims ):
293290 return any (len (self [d ] & {PARALLEL , PARALLEL_INDEP }) > 0
294291 for d in as_tuple (dims ))
@@ -310,10 +307,7 @@ def is_sequential(self, dims):
310307 return any (SEQUENTIAL in self .get (d , ()) for d in as_tuple (dims ))
311308
312309 def is_blockable (self , d ):
313- return bool (self .get (d , set ()) & {TILABLE , TILABLE_SMALL })
314-
315- def is_blockable_small (self , d ):
316- return TILABLE_SMALL in self .get (d , set ())
310+ return bool (TILABLE in self .get (d , ()))
317311
318312 def _is_property_any (self , dims , v ):
319313 if dims is None :
@@ -335,6 +329,25 @@ def is_halo_right_init(self, dims=None):
335329 def is_halo_init (self , dims = None ):
336330 return self .is_halo_left_init (dims ) or self .is_halo_right_init (dims )
337331
332+ def avoid_tuning (self , dims ):
333+ return any (NO_TUNING in self .get (d , set ()) for d in as_tuple (dims ))
334+
335+ def subs (self , mapper ):
336+ return Properties ({mapper .get (d , d ): v for d , v in self .items ()})
337+
338+ def promote (self , subs ):
339+ m = self
340+ for d , pd in subs .items ():
341+ if pd not in d ._defines :
342+ raise ValueError (f"Cannot promote { d } to { pd } as { pd } does not "
343+ f"belong to { d } 's hierarchy" )
344+
345+ v = normalize_properties (* [self .get (i , set ()) for i in d ._defines ])
346+
347+ m = self .drop (d ._defines ).add (pd , v )
348+
349+ return m
350+
338351 @property
339352 def nblockable (self ):
340353 return sum ([self .is_blockable (d ) for d in self ])
0 commit comments