[llvm-commits] [polly] r161157 - in /polly/trunk: CMakeLists.txt Makefile.config.in autoconf/configure.ac cmake/FindPluto.cmake configure include/polly/Config/config.h.cmake include/polly/Config/config.h.in include/polly/LinkAllPasses.h lib/CMakeLists.txt lib/Pluto.cpp lib/RegisterPasses.cpp

Tobias Grosser grosser at fim.uni-passau.de
Thu Aug 2 00:47:27 PDT 2012


Author: grosser
Date: Thu Aug  2 02:47:26 2012
New Revision: 161157

URL: http://llvm.org/viewvc/llvm-project?rev=161157&view=rev
Log:
Add support for libpluto as the scheduling optimizer.

Added:
    polly/trunk/cmake/FindPluto.cmake
    polly/trunk/lib/Pluto.cpp
Modified:
    polly/trunk/CMakeLists.txt
    polly/trunk/Makefile.config.in
    polly/trunk/autoconf/configure.ac
    polly/trunk/configure
    polly/trunk/include/polly/Config/config.h.cmake
    polly/trunk/include/polly/Config/config.h.in
    polly/trunk/include/polly/LinkAllPasses.h
    polly/trunk/lib/CMakeLists.txt
    polly/trunk/lib/RegisterPasses.cpp

Modified: polly/trunk/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/CMakeLists.txt?rev=161157&r1=161156&r2=161157&view=diff
==============================================================================
--- polly/trunk/CMakeLists.txt (original)
+++ polly/trunk/CMakeLists.txt Thu Aug  2 02:47:26 2012
@@ -74,6 +74,7 @@
 FIND_PACKAGE(Cloog REQUIRED)
 FIND_PACKAGE(Isl REQUIRED)
 FIND_PACKAGE(Gmp REQUIRED)
+FIND_PACKAGE(Pluto)
 FIND_PACKAGE(CUDA)
 
 option(POLLY_ENABLE_OPENSCOP "Enable Openscop library for scop import/export" ON)
@@ -89,6 +90,9 @@
 if (CLOOG_FOUND)
   INCLUDE_DIRECTORIES( ${CLOOG_INCLUDE_DIR} )
 endif(CLOOG_FOUND)
+if (PLUTO_FOUND)
+  INCLUDE_DIRECTORIES( ${PLUTO_INCLUDE_DIR} )
+endif(PLUTO_FOUND)
 INCLUDE_DIRECTORIES( ${ISL_INCLUDE_DIR} )
 INCLUDE_DIRECTORIES( ${GMP_INCLUDE_DIR} )
 

Modified: polly/trunk/Makefile.config.in
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/Makefile.config.in?rev=161157&r1=161156&r2=161157&view=diff
==============================================================================
--- polly/trunk/Makefile.config.in (original)
+++ polly/trunk/Makefile.config.in Thu Aug  2 02:47:26 2012
@@ -37,10 +37,10 @@
 # Set include directroys
 POLLY_INC :=  @gmp_inc@ @isl_inc@ \
               @cloog_inc@ @openscop_inc@ @scoplib_inc@ @cuda_inc@\
-	      -I$(POLLY_SRC_ROOT)/lib/JSON/include
+	      @pluto_inc@ -I$(POLLY_SRC_ROOT)/lib/JSON/include
 
 POLLY_LD := @gmp_ld@ @isl_ld@ @cloog_ld@ @openscop_ld@ @scoplib_ld@ \
-            @scoplib_rpath@ @cuda_ld@
+            @scoplib_rpath@ @cuda_ld@ @pluto_ld@
 
 POLLY_LIB := @gmp_lib@ @isl_lib@ @cloog_lib@ @openscop_lib@ @scoplib_lib@ \
-             @cuda_lib@
+             @cuda_lib@ @pluto_lib@

Modified: polly/trunk/autoconf/configure.ac
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/autoconf/configure.ac?rev=161157&r1=161156&r2=161157&view=diff
==============================================================================
--- polly/trunk/autoconf/configure.ac (original)
+++ polly/trunk/autoconf/configure.ac Thu Aug  2 02:47:26 2012
@@ -93,6 +93,14 @@
 AS_IF([test "x$cloog_found" = "xyes"],
   [AC_DEFINE([CLOOG_FOUND],[1],[Define if cloog found])])
 
+dnl Check that we have libpluto.
+saved_CXXFLAGS=$CXXFLAGS
+CXXFLAGS="$CXXFLAGS $gmp_inc $isl_inc"
+find_lib_and_headers([pluto], [pluto/libpluto.h], [pluto])
+CXXFLAGS=$saved_CXXFLAGS
+AS_IF([test "x$pluto_found" = "xyes"],
+  [AC_DEFINE([PLUTO_FOUND],[1],[Define if pluto found])])
+
 dnl Check that we have openscop.
 find_lib_and_headers([openscop], [openscop/scop.h], [openscop])
 AS_IF([test "x$openscop_found" = "xyes"],

Added: polly/trunk/cmake/FindPluto.cmake
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/cmake/FindPluto.cmake?rev=161157&view=auto
==============================================================================
--- polly/trunk/cmake/FindPluto.cmake (added)
+++ polly/trunk/cmake/FindPluto.cmake Thu Aug  2 02:47:26 2012
@@ -0,0 +1,19 @@
+FIND_PATH(PLUTO_INCLUDE_DIR pluto/libpluto.h)
+
+FIND_LIBRARY(PLUTO_LIBRARY NAMES pluto)
+
+IF (PLUTO_INCLUDE_DIR AND PLUTO_LIBRARY)
+  SET(PLUTO_FOUND TRUE)
+ENDIF (PLUTO_INCLUDE_DIR AND PLUTO_LIBRARY)
+
+
+IF (PLUTO_FOUND)
+  IF (NOT PLUTO_FIND_QUIETLY)
+    MESSAGE(STATUS "Found Pluto: ${PLUTO_LIBRARY}")
+  ENDIF (NOT PLUTO_FIND_QUIETLY)
+ELSE (PLUTO_FOUND)
+  IF (PLUTO_FIND_REQUIRED)
+    MESSAGE(FATAL_ERROR "Could not find Pluto")
+  ENDIF (PLUTO_FIND_REQUIRED)
+ENDIF (PLUTO_FOUND)
+

Modified: polly/trunk/configure
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/configure?rev=161157&r1=161156&r2=161157&view=diff
==============================================================================
--- polly/trunk/configure (original)
+++ polly/trunk/configure Thu Aug  2 02:47:26 2012
@@ -580,6 +580,10 @@
 openscop_lib
 openscop_inc
 openscop_found
+pluto_ld
+pluto_lib
+pluto_inc
+pluto_found
 cloog_ld
 cloog_lib
 cloog_inc
@@ -647,6 +651,7 @@
 with_gmp
 with_isl
 with_cloog
+with_pluto
 with_openscop
 with_scoplib
 with_cuda
@@ -1275,6 +1280,7 @@
   --with-gmp              prefix of gmp
   --with-isl              prefix of isl
   --with-cloog            prefix of cloog
+  --with-pluto            prefix of pluto
   --with-openscop         prefix of openscop
   --with-scoplib          prefix of scoplib
   --with-cuda             prefix of cuda
@@ -2730,6 +2736,94 @@
 
 fi
 
+saved_CXXFLAGS=$CXXFLAGS
+CXXFLAGS="$CXXFLAGS $gmp_inc $isl_inc"
+
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+  OLD_CXXFLAGS=$CXXFLAGS;
+  OLD_LDFLAGS=$LDFLAGS;
+  OLD_LIBS=$LIBS;
+
+  LIBS="$LIBS -lpluto";
+
+  # Get include path and lib path
+
+# Check whether --with-pluto was given.
+if test "${with_pluto+set}" = set; then :
+  withval=$with_pluto; given_inc_path="$withval/include"; CXXFLAGS="-I$given_inc_path $CXXFLAGS";
+       given_lib_path="$withval/lib"; LDFLAGS="-L$given_lib_path $LDFLAGS"
+else
+  given_inc_path=inc_not_give_pluto;
+       given_lib_path=lib_not_give_pluto
+
+fi
+
+  # Check for library and headers works
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pluto: pluto/libpluto.h in $given_inc_path, and libpluto in $given_lib_path" >&5
+$as_echo_n "checking for pluto: pluto/libpluto.h in $given_inc_path, and libpluto in $given_lib_path... " >&6; }
+
+  # try to compile a file that includes a header of the library
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <pluto/libpluto.h>
+int
+main ()
+{
+;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+$as_echo "ok" >&6; }
+    pluto_found="yes"
+
+    if test "x$given_inc_path" != "xinc_not_give_pluto"; then :
+  pluto_inc="-I$given_inc_path"
+
+fi
+    pluto_lib="-lpluto"
+
+    if test "x$given_lib_path" != "xlib_not_give_pluto"; then :
+  pluto_ld="-L$given_lib_path"
+
+fi
+else
+  if test "x" = "xrequired"; then :
+  as_fn_error $? "pluto required but not found" "$LINENO" 5
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
+$as_echo "not found" >&6; }
+fi
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+  # reset original CXXFLAGS
+  CXXFLAGS=$OLD_CXXFLAGS
+  LDFLAGS=$OLD_LDFLAGS;
+  LIBS=$OLD_LIBS
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+CXXFLAGS=$saved_CXXFLAGS
+if test "x$pluto_found" = "xyes"; then :
+
+$as_echo "#define PLUTO_FOUND 1" >>confdefs.h
+
+fi
+
 
   ac_ext=cpp
 ac_cpp='$CXXCPP $CPPFLAGS'

Modified: polly/trunk/include/polly/Config/config.h.cmake
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/include/polly/Config/config.h.cmake?rev=161157&r1=161156&r2=161157&view=diff
==============================================================================
--- polly/trunk/include/polly/Config/config.h.cmake (original)
+++ polly/trunk/include/polly/Config/config.h.cmake Thu Aug  2 02:47:26 2012
@@ -16,6 +16,7 @@
 #cmakedefine CLOOG_FOUND
 #cmakedefine ISL_CODEGEN_FOUND
 #cmakedefine OPENSCOP_FOUND
+#cmakedefine PLUTO_FOUND
 #cmakedefine SCOPLIB_FOUND
 #cmakedefine CUDALIB_FOUND
 

Modified: polly/trunk/include/polly/Config/config.h.in
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/include/polly/Config/config.h.in?rev=161157&r1=161156&r2=161157&view=diff
==============================================================================
--- polly/trunk/include/polly/Config/config.h.in (original)
+++ polly/trunk/include/polly/Config/config.h.in Thu Aug  2 02:47:26 2012
@@ -33,5 +33,8 @@
 /* Define to the version of this package. */
 #undef PACKAGE_VERSION
 
+/* Define if pluto found */
+#undef PLUTO_FOUND
+
 /* Define if scoplib found */
 #undef SCOPLIB_FOUND

Modified: polly/trunk/include/polly/LinkAllPasses.h
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/include/polly/LinkAllPasses.h?rev=161157&r1=161156&r2=161157&view=diff
==============================================================================
--- polly/trunk/include/polly/LinkAllPasses.h (original)
+++ polly/trunk/include/polly/LinkAllPasses.h Thu Aug  2 02:47:26 2012
@@ -45,6 +45,9 @@
   Pass *createIndVarSimplifyPass();
   Pass *createJSONExporterPass();
   Pass *createJSONImporterPass();
+#ifdef PLUTO_FOUND
+  Pass *createPlutoOptimizerPass();
+#endif
   Pass *createRegionSimplifyPass();
   Pass *createScopDetectionPass();
   Pass *createScopInfoPass();
@@ -98,6 +101,9 @@
        createRegionSimplifyPass();
        createScopDetectionPass();
        createScopInfoPass();
+#ifdef PLUTO_FOUND
+       createPlutoOptimizerPass();
+#endif
        createIslScheduleOptimizerPass();
        createTempScopInfoPass();
 
@@ -126,6 +132,9 @@
   void initializeJSONExporterPass(llvm::PassRegistry&);
   void initializeJSONImporterPass(llvm::PassRegistry&);
   void initializeIslScheduleOptimizerPass(llvm::PassRegistry&);
+#ifdef PLUTO_FOUND
+  void initializePlutoOptimizerPass(llvm::PassRegistry&);
+#endif
 #ifdef SCOPLIB_FOUND
   void initializePoccPass(llvm::PassRegistry&);
 #endif

Modified: polly/trunk/lib/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/CMakeLists.txt?rev=161157&r1=161156&r2=161157&view=diff
==============================================================================
--- polly/trunk/lib/CMakeLists.txt (original)
+++ polly/trunk/lib/CMakeLists.txt Thu Aug  2 02:47:26 2012
@@ -11,6 +11,10 @@
   set(POLLY_SCOPLIB_FILES Pocc.cpp)
 endif (SCOPLIB_FOUND)
 
+if (PLUTO_FOUND)
+  set(POLLY_PLUTO_FILES Pluto.cpp)
+endif (PLUTO_FOUND)
+
 set(LLVM_USED_LIBS
   PollyAnalysis
   PollyCodeGen
@@ -30,6 +34,7 @@
   RegisterPasses.cpp
   ScheduleOptimizer.cpp
   ${POLLY_SCOPLIB_FILES}
+  ${POLLY_PLUTO_FILES}
   )
 
 add_dependencies(LLVMPolly
@@ -44,3 +49,7 @@
   PROPERTIES
   LINKER_LANGUAGE CXX
   PREFIX "")
+
+if (PLUTO_FOUND)
+  target_link_libraries(LLVMPolly ${PLUTO_LIBRARY})
+endif(PLUTO_FOUND)

Added: polly/trunk/lib/Pluto.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Pluto.cpp?rev=161157&view=auto
==============================================================================
--- polly/trunk/lib/Pluto.cpp (added)
+++ polly/trunk/lib/Pluto.cpp Thu Aug  2 02:47:26 2012
@@ -0,0 +1,186 @@
+//===- Pluto.cpp - Calculate an optimized schedule ---------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// Use libpluto to optimize the schedule.
+//
+//===----------------------------------------------------------------------===//
+
+#include "polly/Config/config.h"
+
+#ifdef PLUTO_FOUND
+#include "polly/CodeGen/CodeGeneration.h"
+#include "polly/Dependences.h"
+#include "polly/LinkAllPasses.h"
+#include "polly/ScopInfo.h"
+
+#define DEBUG_TYPE "polly-opt-pluto"
+#include "llvm/Support/Debug.h"
+#include "llvm/Support/CommandLine.h"
+
+#include "pluto/libpluto.h"
+#include "isl/map.h"
+
+
+using namespace llvm;
+using namespace polly;
+
+static cl::opt<bool>
+EnableTiling("polly-pluto-tile",
+             cl::desc("Enable tiling"),
+             cl::Hidden, cl::init(false));
+
+namespace {
+/// Convert an int into a string.
+static std::string convertInt(int number)
+{
+  if (number == 0)
+    return "0";
+  std::string temp = "";
+  std::string returnvalue = "";
+  while (number > 0)
+  {
+    temp += number % 10 + 48;
+    number /= 10;
+  }
+  for (unsigned i = 0; i < temp.length(); i++)
+    returnvalue+=temp[temp.length() - i - 1];
+  return returnvalue;
+}
+
+
+  class PlutoOptimizer : public ScopPass {
+
+  public:
+    static char ID;
+    explicit PlutoOptimizer() : ScopPass(ID) {}
+
+    virtual bool runOnScop(Scop &S);
+    void printScop(llvm::raw_ostream &OS) const;
+    void getAnalysisUsage(AnalysisUsage &AU) const;
+    static void extendScattering(Scop &S, unsigned NewDimensions);
+  };
+}
+
+char PlutoOptimizer::ID = 0;
+
+static int getSingleMap(__isl_take isl_map *map, void *user) {
+  isl_map **singleMap = (isl_map **) user;
+  *singleMap = map;
+
+  return 0;
+}
+
+void PlutoOptimizer::extendScattering(Scop &S, unsigned NewDimensions) {
+  for (Scop::iterator SI = S.begin(), SE = S.end(); SI != SE; ++SI) {
+    ScopStmt *Stmt = *SI;
+    unsigned OldDimensions = Stmt->getNumScattering();
+    isl_space *Space;
+    isl_map *Map, *New;
+
+    Space = isl_space_alloc(Stmt->getIslCtx(), 0, OldDimensions, NewDimensions);
+    Map = isl_map_universe(Space);
+
+    for (unsigned i = 0; i < OldDimensions; i++)
+      Map = isl_map_equate(Map, isl_dim_in, i, isl_dim_out, i);
+
+    for (unsigned i = OldDimensions; i < NewDimensions; i++)
+      Map = isl_map_fix_si(Map, isl_dim_out, i, 0);
+
+
+    Map = isl_map_align_params(Map, S.getParamSpace());
+    New = isl_map_apply_range(Stmt->getScattering(), Map);
+    Stmt->setScattering(New);
+  }
+}
+
+bool PlutoOptimizer::runOnScop(Scop &S) {
+  isl_union_set *Domain;
+  isl_union_map *Deps, *ToPlutoNames, *Schedule;
+  PlutoOptions *Options;
+
+  Dependences *D = &getAnalysis<Dependences>();
+
+  int DependencesKinds = Dependences::TYPE_RAW | Dependences::TYPE_WAR
+                     | Dependences::TYPE_WAW;
+
+  Deps = D->getDependences(DependencesKinds);
+  Domain = S.getDomains();
+  ToPlutoNames = isl_union_map_empty(S.getParamSpace());
+
+  int counter = 0;
+  for (Scop::iterator SI = S.begin(), SE = S.end(); SI != SE; ++SI) {
+    ScopStmt *Stmt = *SI;
+    std::string Name = "S_" + convertInt(counter);
+    isl_map *Identity = isl_map_identity(isl_space_map_from_domain_and_range(
+                          Stmt->getDomainSpace(), Stmt->getDomainSpace()));
+    Identity = isl_map_set_tuple_name(Identity, isl_dim_out, Name.c_str());
+    ToPlutoNames = isl_union_map_add_map(ToPlutoNames, Identity);
+    counter++;
+  }
+
+  Deps = isl_union_map_apply_domain(Deps, isl_union_map_copy(ToPlutoNames));
+  Deps = isl_union_map_apply_range(Deps, isl_union_map_copy(ToPlutoNames));
+  Domain = isl_union_set_apply(Domain, isl_union_map_copy(ToPlutoNames));
+
+  Options = pluto_options_alloc();
+  Options->fuse = 0;
+  Options->tile = EnableTiling;
+
+  Schedule = pluto_schedule(Domain, Deps, Options);
+  pluto_options_free(Options);
+
+  isl_union_set_free(Domain);
+  isl_union_map_free(Deps);
+
+  Schedule = isl_union_map_apply_domain(Schedule,
+                                        isl_union_map_reverse(ToPlutoNames));
+
+  for (Scop::iterator SI = S.begin(), SE = S.end(); SI != SE; ++SI) {
+    ScopStmt *Stmt = *SI;
+    isl_set *Domain = Stmt->getDomain();
+    isl_union_map *StmtBand;
+    StmtBand = isl_union_map_intersect_domain(isl_union_map_copy(Schedule),
+					      isl_union_set_from_set(Domain));
+    isl_map *StmtSchedule;
+    isl_union_map_foreach_map(StmtBand, getSingleMap, &StmtSchedule);
+    Stmt->setScattering(StmtSchedule);
+    isl_union_map_free(StmtBand);
+  }
+
+  isl_union_map_free(Schedule);
+
+  unsigned MaxScatDims = 0;
+
+  for (Scop::iterator SI = S.begin(), SE = S.end(); SI != SE; ++SI)
+    MaxScatDims = std::max((*SI)->getNumScattering(), MaxScatDims);
+
+  extendScattering(S, MaxScatDims);
+  return false;
+}
+
+void PlutoOptimizer::printScop(raw_ostream &OS) const {
+}
+
+void PlutoOptimizer::getAnalysisUsage(AnalysisUsage &AU) const {
+  ScopPass::getAnalysisUsage(AU);
+  AU.addRequired<Dependences>();
+}
+
+INITIALIZE_PASS_BEGIN(PlutoOptimizer, "polly-opt-pluto",
+                      "Polly - Optimize schedule of SCoP (Pluto)", false, false)
+INITIALIZE_PASS_DEPENDENCY(Dependences)
+INITIALIZE_PASS_DEPENDENCY(ScopInfo)
+INITIALIZE_PASS_END(PlutoOptimizer, "polly-opt-pluto",
+                      "Polly - Optimize schedule of SCoP (Pluto)", false, false)
+
+Pass* polly::createPlutoOptimizerPass() {
+  return new PlutoOptimizer();
+}
+
+#endif // PLUTO_FOUND

Modified: polly/trunk/lib/RegisterPasses.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/RegisterPasses.cpp?rev=161157&r1=161156&r2=161157&view=diff
==============================================================================
--- polly/trunk/lib/RegisterPasses.cpp (original)
+++ polly/trunk/lib/RegisterPasses.cpp Thu Aug  2 02:47:26 2012
@@ -48,6 +48,9 @@
 #ifdef SCOPLIB_FOUND
   OPTIMIZER_POCC,
 #endif
+#ifdef PLUTO_FOUND
+  OPTIMIZER_PLUTO,
+#endif
   OPTIMIZER_ISL
 };
 
@@ -56,6 +59,9 @@
           cl::desc("Select the scheduling optimizer"),
           cl::values(
             clEnumValN(OPTIMIZER_NONE, "none", "No optimizer"),
+#ifdef PLUTO_FOUND
+            clEnumValN(OPTIMIZER_PLUTO, "pluto", "The Pluto scheduling optimizer"),
+#endif
 #ifdef SCOPLIB_FOUND
             clEnumValN(OPTIMIZER_POCC, "pocc", "The PoCC scheduling optimizer"),
 #endif
@@ -220,11 +226,17 @@
     break; /* Do nothing */
 
 #ifdef SCOPLIB_FOUND
-  case OPTIMIZER_POCC
+  case OPTIMIZER_POCC:
     PM.add(polly::createPoccPass());
     break;
 #endif
 
+#ifdef PLUTO_FOUND
+  case OPTIMIZER_PLUTO:
+    PM.add(polly::createPlutoOptimizerPass());
+    break;
+#endif
+
   case OPTIMIZER_ISL:
     PM.add(polly::createIslScheduleOptimizerPass());
     break;





More information about the llvm-commits mailing list