From 46e7b9730be955b5402d139caf42dac8593780c4 Mon Sep 17 00:00:00 2001 From: Fabio Luporini Date: Thu, 4 Aug 2016 17:36:03 +0100 Subject: [PATCH] Project correctly from subsets This handles properly fake subsets, e.g. exterior facets --- sparsetiling/src/tiling.cpp | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/sparsetiling/src/tiling.cpp b/sparsetiling/src/tiling.cpp index b37120d..11c2d26 100644 --- a/sparsetiling/src/tiling.cpp +++ b/sparsetiling/src/tiling.cpp @@ -124,12 +124,9 @@ void project_forward (loop_t* tiledLoop, // if projecting from a subset, an older projection must be present. This // is used to replicate an untouched iteration color and tile. - set_t* superset = set_super(tiledLoop->set); - set_t* outSuperset = set_super(descMap->outSet); - if (superset && (! outSuperset || descMap->outSet->size != superset->size)) { - projection_t::iterator oldProjIter2tc = prevLoopProj->find (projIter2tc); - ASSERT (oldProjIter2tc != prevLoopProj->end(), - "Projecting from subset lacks old projection"); + projection_t::iterator oldProjIter2tc = prevLoopProj->find (projIter2tc); + if (oldProjIter2tc != prevLoopProj->end()) { + #pragma omp for schedule(static) for (int i = 0; i < projSetSize; i++) { if (projIter2tile[i] == -1) { projIter2tile[i] = (*oldProjIter2tc)->iter2tile[i]; @@ -137,6 +134,12 @@ void project_forward (loop_t* tiledLoop, } } } + else { + set_t* superset = set_super(tiledLoop->set); + set_t* outSuperset = set_super(descMap->outSet); + ASSERT (! (superset && (! outSuperset || descMap->outSet->size != superset->size)), + "Need old projection for subsets"); + } map_free (descMap, true); } @@ -273,12 +276,9 @@ void project_backward (loop_t* tiledLoop, // if projecting from a subset, an older projection must be present. This // is used to replicate an untouched iteration color and tile. - set_t* superset = set_super(tiledLoop->set); - set_t* outSuperset = set_super(descMap->outSet); - if (superset && (! outSuperset || descMap->outSet->size != superset->size)) { - projection_t::iterator oldProjIter2tc = prevLoopProj->find (projIter2tc); - ASSERT (oldProjIter2tc != prevLoopProj->end(), - "Projecting from subset lacks old projection"); + projection_t::iterator oldProjIter2tc = prevLoopProj->find (projIter2tc); + if (oldProjIter2tc != prevLoopProj->end()) { + #pragma omp for schedule(static) for (int i = 0; i < projSetSize; i++) { if (projIter2tile[i] == INT_MAX) { projIter2tile[i] = (*oldProjIter2tc)->iter2tile[i]; @@ -286,6 +286,12 @@ void project_backward (loop_t* tiledLoop, } } } + else { + set_t* superset = set_super(tiledLoop->set); + set_t* outSuperset = set_super(descMap->outSet); + ASSERT (! (superset && (! outSuperset || descMap->outSet->size != superset->size)), + "Need old projection for subsets"); + } map_free (descMap, true); }