예제 #1
0
const CompSlice* ParameterizeBlocking::
SetBlocking(CompSliceLocalityRegistry *anal, 
                           const CompSliceDepGraphNode::FullNestInfo& nestInfo)
{
  const CompSlice* res = AllLoopReuseBlocking::SetBlocking(anal,nestInfo);
  const CompSliceNest* curNest = nestInfo.GetNest();
#ifdef DEBUG
std::cerr << "Set blocking curNest: " << curNest->toString() << "\n";
#endif
  unsigned size = curNest->NumberOfEntries();
#ifdef DEBUG
std::cerr << "size=" << size  << "\n";
#endif
  if (size <= 1 || !curNest->Entry(size-1)->SliceCommonLoop(curNest->Entry(0)))
  { /*QY: current loop nest is perfectly nested*/
     const CompSliceDepGraphNode::NestInfo* nonperfect = DoNonPerfectBlocking(nestInfo);
     if (nonperfect) 
     { /*QY: extra loops inside; (not considered for blocking normally). */
        const CompSliceNest* innerNest = nonperfect->GetNest();
        assert(innerNest!=0); /*QY: this is why nonperfect is returned */
        int reuseLevel = SliceNestReuseLevel(anal, *innerNest);
        int j = 0, size = innerNest->NumberOfEntries();
        for (; j < reuseLevel; ++j) blocksize.push_back(1);
        for (; j < size; ++j) blocksize.push_back(GetDefaultBlockSize(innerNest->Entry(j)));
        res = innerNest->Entry(size-1);
#ifdef DEBUG
std::cerr << "set nonperfect blocking\n";
#endif 
     }
  }
  return res;
}
예제 #2
0
const CompSlice* InnerLoopReuseBlocking ::
SetBlocking( CompSliceLocalityRegistry *anal, 
                           const CompSliceDepGraphNode::FullNestInfo& nestInfo)
   {
      const CompSliceNest& n = *nestInfo.GetNest();
      blocksize.clear();
      unsigned num = n.NumberOfEntries();
      int reuseLevel = SliceNestReuseLevel(anal, n); 
      blocksize.resize(reuseLevel + 1, 1);
      for ( size_t index = reuseLevel+1; index < num; ++index) 
         blocksize.push_back(GetDefaultBlockSize(n[index]));
      return n[num-1];
}
예제 #3
0
const CompSlice* OuterLoopReuseBlocking ::
SetBlocking( CompSliceLocalityRegistry *anal, 
                           const CompSliceDepGraphNode::FullNestInfo& nestInfo)
   {
      const CompSliceNest& n = *nestInfo.GetNest();
      blocksize.clear();
      size_t num = n.NumberOfEntries();
      int reuseLevel = SliceNestReuseLevel(anal, n); 
      for (int i = 0; i < reuseLevel; ++i)
            blocksize.push_back(1);
      size_t index;
      for ( index = reuseLevel; index < num-spill; ++index)  {
          blocksize.push_back(GetDefaultBlockSize(n[index]));
      }
      for (; index < num; ++index)
            blocksize.push_back(1);
       return n[num-1];
   }