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; }
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]; }
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]; }