[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