Exemplo n.º 1
0
static SymbolicVal GetDefaultBlockSize(const CompSlice* slice) 
    {
       AstInterface& fa = LoopTransformInterface::getAstInterface();
       LoopTransformOptions* opt = LoopTransformOptions::GetInstance();
       if (!opt->DoDynamicTuning()) {
            return opt->GetDefaultBlockSize();
       }
       else {
           int dt = opt->GetDynamicTuningIndex();
           AstInterface::AstNodeList l;
           l.push_back(fa.CreateConstInt(dt));

           CompSlice::ConstLoopIterator iter = slice->GetConstLoopIterator();
           LoopTreeNode *loop = iter.Current();
           SymbolicBound b = loop->GetLoopInfo()->GetBound();
           SymbolicVal size = b.ub - b.lb + 1;
 
           l.push_back(fa.CreateConstInt(1));
           l.push_back(size.CodeGen(fa));
           AstNodePtr init = fa.CreateFunctionCall("getTuningValue", l);
           return SymbolicVar(fa.NewVar(fa.GetType("int"), "",true,AST_NULL, init),AST_NULL); 
       }
    }
Exemplo n.º 2
0
bool ParameterizeCopyArray::
CanBeBlocked( 
     DepCompCopyArrayCollect::CopyArrayUnit& unit, int copydim)
{
   if (copydim == 0) return false;
   
   int k = 0; /* number of sweeping loop dimensions */
   for (int i = 0; i < copydim; ++i) {
      bool sweeping = false; /*QY: any sweeping loops*/
      for (DepCompCopyArrayCollect::CopyArrayUnit::NodeSet::const_iterator 
              p = unit.refs.begin(); !p.ReachEnd(); ++p) {
          int j = 0; /*number of sweeping loop dimensions per array dimension*/
          for (LoopTreeNode* loop = (*p)->GetInfo().stmt->EnclosingLoop(); 
               loop!=0 && loop != unit.root; loop = loop->EnclosingLoop()) {
            AstNodePtr ref = (*p)->GetInfo().orig;
            if (!ReferenceDimension(ref, loop->GetLoopInfo()->GetVar().GetVarName(),i)) { ++j; sweeping=true; break; }
          }
          if (j > 1) return false; /*QY: multiple loops sweeping a dimension*/
      }
      if (sweeping) ++k;
   }
   if (k == 0) return false; /* QY: no sweeping dimensions*/
   return true;
}