Squashed 'third_party/eigen/' changes from 61d72f6..cf794d3


Change-Id: I9b814151b01f49af6337a8605d0c42a3a1ed4c72
git-subtree-dir: third_party/eigen
git-subtree-split: cf794d3b741a6278df169e58461f8529f43bce5d
diff --git a/bench/btl/CMakeLists.txt b/bench/btl/CMakeLists.txt
index 119b470..38ff9f4 100644
--- a/bench/btl/CMakeLists.txt
+++ b/bench/btl/CMakeLists.txt
@@ -11,29 +11,24 @@
 
 string(REGEX MATCH icpc IS_ICPC ${CMAKE_CXX_COMPILER})
 IF(CMAKE_COMPILER_IS_GNUCXX OR IS_ICPC)
-  SET(CMAKE_CXX_FLAGS "-g0 -O3 -DNDEBUG")
-  SET(CMAKE_Fortran_FLAGS "-g0 -O3 -DNDEBUG")
-  IF(NOT BTL_NOVEC)
-    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse2")
-    SET(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -msse2")
-  ELSE(NOT BTL_NOVEC)
+  SET(CMAKE_CXX_FLAGS "-g0 -O3 -DNDEBUG ${CMAKE_CXX_FLAGS}")
+  SET(CMAKE_Fortran_FLAGS "-g0 -O3 -DNDEBUG ${CMAKE_Fortran_FLAGS}")
+  IF(BTL_NOVEC)
     SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DEIGEN_DONT_VECTORIZE")
-  ENDIF(NOT BTL_NOVEC)
+  ENDIF(BTL_NOVEC)
 ENDIF(CMAKE_COMPILER_IS_GNUCXX OR IS_ICPC)
 
 IF(MSVC)
   SET(CMAKE_CXX_FLAGS " /O2 /Ot /GL /fp:fast -DNDEBUG")
 #   SET(CMAKE_Fortran_FLAGS "-g0 -O3 -DNDEBUG")
-  IF(NOT BTL_NOVEC)
-    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:SSE2")
-  ELSE(NOT BTL_NOVEC)
+  IF(BTL_NOVEC)
     SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DEIGEN_DONT_VECTORIZE")
-  ENDIF(NOT BTL_NOVEC)
+  ENDIF(BTL_NOVEC)
 ENDIF(MSVC)
 
 if(IS_ICPC)
-  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fast")
-  set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fast")
+  set(CMAKE_CXX_FLAGS "-fast ${CMAKE_CXX_FLAGS}")
+  set(CMAKE_Fortran_FLAGS "-fast ${CMAKE_Fortran_FLAGS}")
 endif(IS_ICPC)
 
 include_directories(
@@ -48,6 +43,12 @@
 #   set(DEFAULT_LIBRARIES ${MKL_LIBRARIES})
 # endif (MKL_FOUND)
 
+find_library(EIGEN_BTL_RT_LIBRARY rt)
+# if we cannot find it easily, then we don't need it!
+if(NOT EIGEN_BTL_RT_LIBRARY)
+  set(EIGEN_BTL_RT_LIBRARY "")
+endif()
+
 MACRO(BTL_ADD_BENCH targetname)
 
   foreach(_current_var ${ARGN})
@@ -70,7 +71,7 @@
   IF(BUILD_${targetname})
     ADD_EXECUTABLE(${targetname} ${_sources})
     ADD_TEST(${targetname} "${targetname}")
-    target_link_libraries(${targetname} ${DEFAULT_LIBRARIES} rt)
+    target_link_libraries(${targetname} ${DEFAULT_LIBRARIES} ${EIGEN_BTL_RT_LIBRARY})
   ENDIF(BUILD_${targetname})
 
 ENDMACRO(BTL_ADD_BENCH)
@@ -91,6 +92,7 @@
 
 add_subdirectory(libs/eigen3)
 add_subdirectory(libs/eigen2)
+add_subdirectory(libs/tensors)
 add_subdirectory(libs/BLAS)
 add_subdirectory(libs/ublas)
 add_subdirectory(libs/gmm)
@@ -98,6 +100,7 @@
 add_subdirectory(libs/blitz)
 add_subdirectory(libs/tvmet)
 add_subdirectory(libs/STL)
+add_subdirectory(libs/blaze)
 
 add_subdirectory(data)
 
diff --git a/bench/btl/actions/action_axpby.hh b/bench/btl/actions/action_axpby.hh
index 98511ab..dadd0cc 100644
--- a/bench/btl/actions/action_axpby.hh
+++ b/bench/btl/actions/action_axpby.hh
@@ -33,7 +33,7 @@
 public :
 
   // Ctor
-  Action_axpby( int size ):_size(size),_alpha(0.5),_beta(0.95)
+  Action_axpby( int size ):_alpha(0.5),_beta(0.95),_size(size)
   {
     MESSAGE("Action_axpby Ctor");
 
diff --git a/bench/btl/actions/action_axpy.hh b/bench/btl/actions/action_axpy.hh
index e4cb3a5..261be4c 100644
--- a/bench/btl/actions/action_axpy.hh
+++ b/bench/btl/actions/action_axpy.hh
@@ -35,7 +35,7 @@
 
   // Ctor
 
-  Action_axpy( int size ):_size(size),_coef(1.0)
+  Action_axpy( int size ):_coef(1.0),_size(size)
   {
     MESSAGE("Action_axpy Ctor");
 
diff --git a/bench/btl/cmake/FindACML.cmake b/bench/btl/cmake/FindACML.cmake
index f45ae1b..4989fa2 100644
--- a/bench/btl/cmake/FindACML.cmake
+++ b/bench/btl/cmake/FindACML.cmake
@@ -17,6 +17,7 @@
   libacml_mp.so
   PATHS
   /usr/lib
+  /usr/lib64
   $ENV{ACMLDIR}/lib
   ${LIB_INSTALL_DIR}
 )
@@ -35,6 +36,7 @@
         libacml.so libacml_mv.so
         PATHS
         /usr/lib
+        /usr/lib64
         $ENV{ACMLDIR}/lib
         ${LIB_INSTALL_DIR}
         )
diff --git a/bench/btl/cmake/FindATLAS.cmake b/bench/btl/cmake/FindATLAS.cmake
index 6b90652..4136a98 100644
--- a/bench/btl/cmake/FindATLAS.cmake
+++ b/bench/btl/cmake/FindATLAS.cmake
@@ -3,33 +3,25 @@
   set(ATLAS_FIND_QUIETLY TRUE)
 endif (ATLAS_LIBRARIES)
 
-find_file(ATLAS_LIB libatlas.so.3 PATHS /usr/lib $ENV{ATLASDIR} ${LIB_INSTALL_DIR})
-find_library(ATLAS_LIB atlas PATHS $ENV{ATLASDIR} ${LIB_INSTALL_DIR})
+find_file(ATLAS_LIB libatlas.so.3 PATHS /usr/lib /usr/lib/atlas /usr/lib64 /usr/lib64/atlas $ENV{ATLASDIR} ${LIB_INSTALL_DIR})
+find_library(ATLAS_LIB satlas PATHS $ENV{ATLASDIR} ${LIB_INSTALL_DIR})
 
-find_file(ATLAS_CBLAS libcblas.so.3 PATHS /usr/lib $ENV{ATLASDIR} ${LIB_INSTALL_DIR})
-find_library(ATLAS_CBLAS cblas PATHS $ENV{ATLASDIR} ${LIB_INSTALL_DIR})
+find_file(ATLAS_LAPACK NAMES liblapack_atlas.so.3 liblapack.so.3 PATHS /usr/lib /usr/lib/atlas /usr/lib64 /usr/lib64/atlas $ENV{ATLASDIR} ${LIB_INSTALL_DIR})
+find_library(ATLAS_LAPACK NAMES lapack_atlas lapack PATHS $ENV{ATLASDIR} ${LIB_INSTALL_DIR})
 
-find_file(ATLAS_LAPACK liblapack_atlas.so.3 PATHS /usr/lib $ENV{ATLASDIR} ${LIB_INSTALL_DIR})
-find_library(ATLAS_LAPACK lapack_atlas PATHS $ENV{ATLASDIR} ${LIB_INSTALL_DIR})
-
-if(NOT ATLAS_LAPACK)
-  find_file(ATLAS_LAPACK liblapack.so.3 PATHS /usr/lib/atlas $ENV{ATLASDIR} ${LIB_INSTALL_DIR})
-  find_library(ATLAS_LAPACK lapack PATHS $ENV{ATLASDIR} ${LIB_INSTALL_DIR})
-endif(NOT ATLAS_LAPACK)
-
-find_file(ATLAS_F77BLAS libf77blas.so.3 PATHS /usr/lib $ENV{ATLASDIR} ${LIB_INSTALL_DIR})
+find_file(ATLAS_F77BLAS libf77blas.so.3 PATHS /usr/lib /usr/lib/atlas /usr/lib64 /usr/lib64/atlas $ENV{ATLASDIR} ${LIB_INSTALL_DIR})
 find_library(ATLAS_F77BLAS f77blas PATHS $ENV{ATLASDIR} ${LIB_INSTALL_DIR})
 
 if(ATLAS_LIB AND ATLAS_CBLAS AND ATLAS_LAPACK AND ATLAS_F77BLAS)
 
-  set(ATLAS_LIBRARIES ${ATLAS_LAPACK} ${ATLAS_CBLAS}  ${ATLAS_F77BLAS} ${ATLAS_LIB})
+  set(ATLAS_LIBRARIES ${ATLAS_LAPACK}  ${ATLAS_LIB})
   
   # search the default lapack lib link to it
   find_file(ATLAS_REFERENCE_LAPACK liblapack.so.3 PATHS /usr/lib /usr/lib64)
   find_library(ATLAS_REFERENCE_LAPACK NAMES lapack)
-  if(ATLAS_REFERENCE_LAPACK)
-    set(ATLAS_LIBRARIES ${ATLAS_LIBRARIES} ${ATLAS_REFERENCE_LAPACK})
-  endif()
+#   if(ATLAS_REFERENCE_LAPACK)
+#     set(ATLAS_LIBRARIES ${ATLAS_LIBRARIES} ${ATLAS_REFERENCE_LAPACK})
+#   endif()
   
 endif(ATLAS_LIB AND ATLAS_CBLAS AND ATLAS_LAPACK AND ATLAS_F77BLAS)
 
diff --git a/bench/btl/cmake/FindBLAZE.cmake b/bench/btl/cmake/FindBLAZE.cmake
new file mode 100644
index 0000000..dba4c89
--- /dev/null
+++ b/bench/btl/cmake/FindBLAZE.cmake
@@ -0,0 +1,31 @@
+# - Try to find eigen2 headers
+# Once done this will define
+#
+#  BLAZE_FOUND - system has blaze lib
+#  BLAZE_INCLUDE_DIR - the blaze include directory
+#
+# Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
+# Adapted from FindEigen.cmake:
+# Copyright (c) 2006, 2007 Montel Laurent, <montel@kde.org>
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+if (BLAZE_INCLUDE_DIR)
+
+  # in cache already
+  set(BLAZE_FOUND TRUE)
+
+else (BLAZE_INCLUDE_DIR)
+
+find_path(BLAZE_INCLUDE_DIR NAMES blaze/Blaze.h
+     PATHS
+     ${INCLUDE_INSTALL_DIR}
+   )
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(BLAZE DEFAULT_MSG BLAZE_INCLUDE_DIR)
+
+mark_as_advanced(BLAZE_INCLUDE_DIR)
+
+endif(BLAZE_INCLUDE_DIR)
+
diff --git a/bench/btl/cmake/FindCBLAS.cmake b/bench/btl/cmake/FindCBLAS.cmake
index 554f029..ce0f2f2 100644
--- a/bench/btl/cmake/FindCBLAS.cmake
+++ b/bench/btl/cmake/FindCBLAS.cmake
@@ -23,6 +23,7 @@
   libcblas.so.3
   PATHS
   /usr/lib
+  /usr/lib64
   $ENV{CBLASDIR}/lib
   ${LIB_INSTALL_DIR}
 )
diff --git a/bench/btl/cmake/FindGOTO.cmake b/bench/btl/cmake/FindGOTO.cmake
deleted file mode 100644
index 67ea093..0000000
--- a/bench/btl/cmake/FindGOTO.cmake
+++ /dev/null
@@ -1,15 +0,0 @@
-
-if (GOTO_LIBRARIES)
-  set(GOTO_FIND_QUIETLY TRUE)
-endif (GOTO_LIBRARIES)
-
-find_library(GOTO_LIBRARIES goto PATHS $ENV{GOTODIR} ${LIB_INSTALL_DIR})
-
-if(GOTO_LIBRARIES AND CMAKE_COMPILER_IS_GNUCXX)
-  set(GOTO_LIBRARIES ${GOTO_LIBRARIES} "-lpthread -lgfortran")
-endif()
-
-include(FindPackageHandleStandardArgs)
-find_package_handle_standard_args(GOTO DEFAULT_MSG GOTO_LIBRARIES)
-
-mark_as_advanced(GOTO_LIBRARIES)
diff --git a/bench/btl/cmake/FindGOTO2.cmake b/bench/btl/cmake/FindGOTO2.cmake
deleted file mode 100644
index baa68d2..0000000
--- a/bench/btl/cmake/FindGOTO2.cmake
+++ /dev/null
@@ -1,25 +0,0 @@
-
-if (GOTO2_LIBRARIES)
-  set(GOTO2_FIND_QUIETLY TRUE)
-endif (GOTO2_LIBRARIES)
-# 
-# find_path(GOTO_INCLUDES
-#   NAMES
-#   cblas.h
-#   PATHS
-#   $ENV{GOTODIR}/include
-#   ${INCLUDE_INSTALL_DIR}
-# )
-
-find_file(GOTO2_LIBRARIES libgoto2.so PATHS /usr/lib $ENV{GOTO2DIR} ${LIB_INSTALL_DIR})
-find_library(GOTO2_LIBRARIES goto2 PATHS $ENV{GOTO2DIR} ${LIB_INSTALL_DIR})
-
-if(GOTO2_LIBRARIES AND CMAKE_COMPILER_IS_GNUCXX)
-  set(GOTO2_LIBRARIES ${GOTO2_LIBRARIES} "-lpthread -lgfortran")
-endif()
-
-include(FindPackageHandleStandardArgs)
-find_package_handle_standard_args(GOTO2 DEFAULT_MSG
-                                  GOTO2_LIBRARIES)
-
-mark_as_advanced(GOTO2_LIBRARIES)
diff --git a/bench/btl/cmake/FindOPENBLAS.cmake b/bench/btl/cmake/FindOPENBLAS.cmake
new file mode 100644
index 0000000..2a09194
--- /dev/null
+++ b/bench/btl/cmake/FindOPENBLAS.cmake
@@ -0,0 +1,17 @@
+
+if (OPENBLAS_LIBRARIES)
+  set(OPENBLAS_FIND_QUIETLY TRUE)
+endif (OPENBLAS_LIBRARIES)
+
+find_file(OPENBLAS_LIBRARIES NAMES libopenblas.so libopenblas.so.0 PATHS /usr/lib /usr/lib64 $ENV{OPENBLASDIR} ${LIB_INSTALL_DIR})
+find_library(OPENBLAS_LIBRARIES openblas PATHS $ENV{OPENBLASDIR} ${LIB_INSTALL_DIR})
+
+if(OPENBLAS_LIBRARIES AND CMAKE_COMPILER_IS_GNUCXX)
+  set(OPENBLAS_LIBRARIES ${OPENBLAS_LIBRARIES} "-lpthread -lgfortran")
+endif()
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(OPENBLAS DEFAULT_MSG
+                                  OPENBLAS_LIBRARIES)
+
+mark_as_advanced(OPENBLAS_LIBRARIES)
diff --git a/bench/btl/data/action_settings.txt b/bench/btl/data/action_settings.txt
index e32213e..39d2b5d 100644
--- a/bench/btl/data/action_settings.txt
+++ b/bench/btl/data/action_settings.txt
@@ -1,19 +1,19 @@
-aat ; "{/*1.5 A x A^T}" ; "matrix size" ; 4:3000
-ata ; "{/*1.5 A^T x A}" ; "matrix size" ; 4:3000
-atv ; "{/*1.5 matrix^T x vector}" ; "matrix size" ; 4:3000
+aat ; "{/*1.5 A x A^T}" ; "matrix size" ; 4:5000
+ata ; "{/*1.5 A^T x A}" ; "matrix size" ; 4:5000
+atv ; "{/*1.5 matrix^T x vector}" ; "matrix size" ; 4:5000
 axpby ; "{/*1.5 Y = alpha X + beta Y}" ; "vector size" ; 5:1000000
 axpy ; "{/*1.5 Y += alpha X}" ; "vector size" ; 5:1000000
-matrix_matrix ; "{/*1.5 matrix matrix product}" ; "matrix size" ; 4:3000
-matrix_vector ; "{/*1.5 matrix vector product}" ; "matrix size" ; 4:3000
-trmm ; "{/*1.5 triangular matrix matrix product}" ; "matrix size" ; 4:3000
-trisolve_vector ; "{/*1.5 triangular solver - vector (X = inv(L) X)}" ; "size" ; 4:3000
-trisolve_matrix ; "{/*1.5 triangular solver - matrix (M = inv(L) M)}" ; "size" ; 4:3000
-cholesky ; "{/*1.5 Cholesky decomposition}" ; "matrix size" ; 4:3000
-complete_lu_decomp ; "{/*1.5 Complete LU decomposition}" ; "matrix size" ; 4:3000
-partial_lu_decomp ; "{/*1.5 Partial LU decomposition}" ; "matrix size" ; 4:3000
-tridiagonalization ; "{/*1.5 Tridiagonalization}" ; "matrix size" ; 4:3000
-hessenberg ; "{/*1.5 Hessenberg decomposition}" ; "matrix size" ; 4:3000
-symv ; "{/*1.5 symmetric matrix vector product}" ; "matrix size" ; 4:3000
-syr2 ; "{/*1.5 symmretric rank-2 update (A += u^T v + u v^T)}" ; "matrix size" ; 4:3000
-ger ; "{/*1.5 general rank-1 update (A += u v^T)}" ; "matrix size" ; 4:3000
-rot ; "{/*1.5 apply rotation in the plane}" ; "vector size" ; 4:1000000
\ No newline at end of file
+matrix_matrix ; "{/*1.5 matrix matrix product}" ; "matrix size" ; 4:5000
+matrix_vector ; "{/*1.5 matrix vector product}" ; "matrix size" ; 4:5000
+trmm ; "{/*1.5 triangular matrix matrix product}" ; "matrix size" ; 4:5000
+trisolve_vector ; "{/*1.5 triangular solver - vector (X = inv(L) X)}" ; "size" ; 4:5000
+trisolve_matrix ; "{/*1.5 triangular solver - matrix (M = inv(L) M)}" ; "size" ; 4:5000
+cholesky ; "{/*1.5 Cholesky decomposition}" ; "matrix size" ; 4:5000
+complete_lu_decomp ; "{/*1.5 Complete LU decomposition}" ; "matrix size" ; 4:5000
+partial_lu_decomp ; "{/*1.5 Partial LU decomposition}" ; "matrix size" ; 4:5000
+tridiagonalization ; "{/*1.5 Tridiagonalization}" ; "matrix size" ; 4:5000
+hessenberg ; "{/*1.5 Hessenberg decomposition}" ; "matrix size" ; 4:5000
+symv ; "{/*1.5 symmetric matrix vector product}" ; "matrix size" ; 4:5000
+syr2 ; "{/*1.5 symmretric rank-2 update (A += u^T v + u v^T)}" ; "matrix size" ; 4:5000
+ger ; "{/*1.5 general rank-1 update (A += u v^T)}" ; "matrix size" ; 4:5000
+rot ; "{/*1.5 apply rotation in the plane}" ; "vector size" ; 4:1000000
diff --git a/bench/btl/data/perlib_plot_settings.txt b/bench/btl/data/perlib_plot_settings.txt
index 6844bab..f023cfe 100644
--- a/bench/btl/data/perlib_plot_settings.txt
+++ b/bench/btl/data/perlib_plot_settings.txt
@@ -10,7 +10,7 @@
 mtl4 ;            with lines lw 3 lt 1 lc rgbcolor "#d18847"
 blitz ;           with lines lw 3 lt 1 lc rgbcolor "#ff00ff"
 F77 ;             with lines lw 3 lt 3 lc rgbcolor "#e6e64c"
-GOTO ;            with lines lw 3 lt 3 lc rgbcolor "#C05600"
-GOTO2 ;           with lines lw 3 lt 1 lc rgbcolor "#C05600"
+OPENBLAS ;        with lines lw 3 lt 1 lc rgbcolor "#C05600"
 C ;               with lines lw 3 lt 3 lc rgbcolor "#e6bd96"
 ACML ;            with lines lw 2 lt 3 lc rgbcolor "#e6e64c"
+blaze ;           with lines lw 3 lt 1 lc rgbcolor "#ff00ff"
diff --git a/bench/btl/generic_bench/bench.hh b/bench/btl/generic_bench/bench.hh
index 005c363..7b7b951 100644
--- a/bench/btl/generic_bench/bench.hh
+++ b/bench/btl/generic_bench/bench.hh
@@ -102,8 +102,8 @@
       // merge the two data
       std::vector<int> newSizes;
       std::vector<double> newFlops;
-      int i=0;
-      int j=0;
+      unsigned int i=0;
+      unsigned int j=0;
       while (i<tab_sizes.size() && j<oldSizes.size())
       {
         if (tab_sizes[i] == oldSizes[j])
diff --git a/bench/btl/generic_bench/bench_parameter.hh b/bench/btl/generic_bench/bench_parameter.hh
index 4c355cd..2b01149 100644
--- a/bench/btl/generic_bench/bench_parameter.hh
+++ b/bench/btl/generic_bench/bench_parameter.hh
@@ -29,11 +29,11 @@
 // min vector size for axpy bench
 #define MIN_AXPY 5
 // max vector size for axpy bench
-#define MAX_AXPY 1000000
+#define MAX_AXPY 3000000
 // min matrix size for matrix vector product bench
 #define MIN_MV 5
 // max matrix size for matrix vector product bench
-#define MAX_MV 3000
+#define MAX_MV 5000
 // min matrix size for matrix matrix product bench
 #define MIN_MM 5
 // max matrix size for matrix matrix product bench
diff --git a/bench/btl/generic_bench/btl.hh b/bench/btl/generic_bench/btl.hh
index f1a88ff..706b00f 100644
--- a/bench/btl/generic_bench/btl.hh
+++ b/bench/btl/generic_bench/btl.hh
@@ -44,15 +44,10 @@
 #define BTL_ASM_COMMENT(X)
 #endif
 
-#if (defined __GNUC__) && (!defined __INTEL_COMPILER) && !defined(__arm__) && !defined(__powerpc__)
-#define BTL_DISABLE_SSE_EXCEPTIONS()  { \
-  int aux; \
-  asm( \
-  "stmxcsr   %[aux]           \n\t" \
-  "orl       $32832, %[aux]   \n\t" \
-  "ldmxcsr   %[aux]           \n\t" \
-  : : [aux] "m" (aux)); \
-}
+#ifdef __SSE__
+#include "xmmintrin.h"
+// This enables flush to zero (FTZ) and denormals are zero (DAZ) modes:
+#define BTL_DISABLE_SSE_EXCEPTIONS()  { _mm_setcsr(_mm_getcsr() | 0x8040); }
 #else
 #define BTL_DISABLE_SSE_EXCEPTIONS()
 #endif
@@ -176,7 +171,7 @@
     if (_config!=NULL)
     {
       std::vector<BtlString> config = BtlString(_config).split(" \t\n");
-      for (int i = 0; i<config.size(); i++)
+      for (unsigned int i = 0; i<config.size(); i++)
       {
         if (config[i].beginsWith("-a"))
         {
@@ -224,7 +219,7 @@
       return false;
 
     BtlString name(_name);
-    for (int i=0; i<Instance.m_selectedActionNames.size(); ++i)
+    for (unsigned int i=0; i<Instance.m_selectedActionNames.size(); ++i)
       if (name.contains(Instance.m_selectedActionNames[i]))
         return false;
 
diff --git a/bench/btl/generic_bench/init/init_function.hh b/bench/btl/generic_bench/init/init_function.hh
index 7b3bdba..e467cb6 100644
--- a/bench/btl/generic_bench/init/init_function.hh
+++ b/bench/btl/generic_bench/init/init_function.hh
@@ -30,23 +30,23 @@
   return index_i+index_j;
 }
 
-double pseudo_random(int index)
+double pseudo_random(int /*index*/)
 {
   return std::rand()/double(RAND_MAX);
 }
 
-double pseudo_random(int index_i, int index_j)
+double pseudo_random(int /*index_i*/, int /*index_j*/)
 {
   return std::rand()/double(RAND_MAX);
 }
 
 
-double null_function(int index)
+double null_function(int /*index*/)
 {
   return 0.0;
 }
 
-double null_function(int index_i, int index_j)
+double null_function(int /*index_i*/, int /*index_j*/)
 {
   return 0.0;
 }
diff --git a/bench/btl/generic_bench/init/init_matrix.hh b/bench/btl/generic_bench/init/init_matrix.hh
index 67cbd20..6382d30 100644
--- a/bench/btl/generic_bench/init/init_matrix.hh
+++ b/bench/btl/generic_bench/init/init_matrix.hh
@@ -29,7 +29,7 @@
 
   X.resize(size);
 
-  for (int j=0;j<X.size();j++){
+  for (unsigned int j=0;j<X.size();j++){
     X[j]=typename Vector::value_type(init_function(row,j));
   }
 }
@@ -42,7 +42,7 @@
 template<double init_function(int,int),class Vector>
 BTL_DONT_INLINE void init_matrix(Vector &  A, int size){
   A.resize(size);
-  for (int row=0; row<A.size() ; row++){
+  for (unsigned int row=0; row<A.size() ; row++){
     init_row<init_function>(A[row],size,row);
   }
 }
@@ -50,11 +50,11 @@
 template<double init_function(int,int),class Matrix>
 BTL_DONT_INLINE void init_matrix_symm(Matrix&  A, int size){
   A.resize(size);
-  for (int row=0; row<A.size() ; row++)
+  for (unsigned int row=0; row<A.size() ; row++)
     A[row].resize(size);
-  for (int row=0; row<A.size() ; row++){
+  for (unsigned int row=0; row<A.size() ; row++){
     A[row][row] = init_function(row,row);
-    for (int col=0; col<row ; col++){
+    for (unsigned int col=0; col<row ; col++){
       double x = init_function(row,col);
       A[row][col] = A[col][row] = x;
     }
diff --git a/bench/btl/generic_bench/init/init_vector.hh b/bench/btl/generic_bench/init/init_vector.hh
index efaf0c9..518e87d 100644
--- a/bench/btl/generic_bench/init/init_vector.hh
+++ b/bench/btl/generic_bench/init/init_vector.hh
@@ -29,7 +29,7 @@
 
   X.resize(size);
 
-  for (int i=0;i<X.size();i++){
+  for (unsigned int i=0;i<X.size();i++){
     X[i]=typename Vector::value_type(init_function(i));
   }
 }
diff --git a/bench/btl/generic_bench/timers/portable_perf_analyzer.hh b/bench/btl/generic_bench/timers/portable_perf_analyzer.hh
index fc0f316..5e579fb 100644
--- a/bench/btl/generic_bench/timers/portable_perf_analyzer.hh
+++ b/bench/btl/generic_bench/timers/portable_perf_analyzer.hh
@@ -78,7 +78,7 @@
     // time measurement
     action.calculate();
     _chronos.start();
-    for (int ii=0;ii<_nb_calc;ii++)
+    for (unsigned int ii=0;ii<_nb_calc;ii++)
     {
       action.calculate();
     }
diff --git a/bench/btl/generic_bench/timers/portable_timer.hh b/bench/btl/generic_bench/timers/portable_timer.hh
index e6ad309..c199811 100755
--- a/bench/btl/generic_bench/timers/portable_timer.hh
+++ b/bench/btl/generic_bench/timers/portable_timer.hh
@@ -34,7 +34,7 @@
 //  timer  -------------------------------------------------------------------//
 
 //  A timer object measures CPU time.
-#ifdef _MSC_VER
+#if defined(_MSC_VER)
 
 #define NOMINMAX
 #include <windows.h>
@@ -87,6 +87,48 @@
 
  }; // Portable_Timer
 
+#elif defined(__APPLE__)
+#include <CoreServices/CoreServices.h>
+#include <mach/mach_time.h>
+
+
+class Portable_Timer
+{
+ public:
+
+  Portable_Timer()
+  {
+  }
+
+  void start()
+  {
+    m_start_time = double(mach_absolute_time())*1e-9;;
+
+  }
+
+  void stop()
+  {
+    m_stop_time = double(mach_absolute_time())*1e-9;;
+
+  }
+
+  double elapsed()
+  {
+    return  user_time();
+  }
+
+  double user_time()
+  {
+    return m_stop_time - m_start_time;
+  }
+
+
+private:
+
+  double m_stop_time, m_start_time;
+
+}; // Portable_Timer (Apple)
+
 #else
 
 #include <sys/time.h>
@@ -138,7 +180,7 @@
   int m_clkid;
   double m_stop_time, m_start_time;
 
-}; // Portable_Timer
+}; // Portable_Timer (Linux)
 
 #endif
 
diff --git a/bench/btl/generic_bench/utils/size_lin_log.hh b/bench/btl/generic_bench/utils/size_lin_log.hh
index bca3932..bbc9f54 100644
--- a/bench/btl/generic_bench/utils/size_lin_log.hh
+++ b/bench/btl/generic_bench/utils/size_lin_log.hh
@@ -23,7 +23,7 @@
 #include "size_log.hh"
 
 template<class Vector>
-void size_lin_log(const int nb_point, const int size_min, const int size_max, Vector & X)
+void size_lin_log(const int nb_point, const int /*size_min*/, const int size_max, Vector & X)
 {
   int ten=10;
   int nine=9;
diff --git a/bench/btl/libs/BLAS/CMakeLists.txt b/bench/btl/libs/BLAS/CMakeLists.txt
index de42fe0..0272cca 100644
--- a/bench/btl/libs/BLAS/CMakeLists.txt
+++ b/bench/btl/libs/BLAS/CMakeLists.txt
@@ -18,27 +18,14 @@
 endif (MKL_FOUND)
 
 
-find_package(GOTO2)
-if (GOTO2_FOUND)
-  btl_add_bench(btl_goto2 main.cpp)
-  if(BUILD_btl_goto2)
-    target_link_libraries(btl_goto2 ${GOTO_LIBRARIES} )
-    set_target_properties(btl_goto2 PROPERTIES COMPILE_FLAGS "-DCBLASNAME=GOTO2")
-  endif(BUILD_btl_goto2)
-endif (GOTO2_FOUND)
-
-find_package(GOTO)
-if (GOTO_FOUND)
-  if(GOTO2_FOUND)
-    btl_add_bench(btl_goto main.cpp OFF)
-  else()
-    btl_add_bench(btl_goto main.cpp)
-  endif()
-  if(BUILD_btl_goto)
-    target_link_libraries(btl_goto ${GOTO_LIBRARIES} )
-    set_target_properties(btl_goto PROPERTIES COMPILE_FLAGS "-DCBLASNAME=GOTO")
-  endif(BUILD_btl_goto)
-endif (GOTO_FOUND)
+find_package(OPENBLAS)
+if (OPENBLAS_FOUND)
+  btl_add_bench(btl_openblas main.cpp)
+  if(BUILD_btl_openblas)
+    target_link_libraries(btl_openblas ${OPENBLAS_LIBRARIES} )
+    set_target_properties(btl_openblas PROPERTIES COMPILE_FLAGS "-DCBLASNAME=OPENBLAS")
+  endif(BUILD_btl_openblas)
+endif (OPENBLAS_FOUND)
 
 find_package(ACML)
 if (ACML_FOUND)
diff --git a/bench/btl/libs/BLAS/blas_interface_impl.hh b/bench/btl/libs/BLAS/blas_interface_impl.hh
index 0e84df0..fc4ba2a 100644
--- a/bench/btl/libs/BLAS/blas_interface_impl.hh
+++ b/bench/btl/libs/BLAS/blas_interface_impl.hh
@@ -75,7 +75,6 @@
   static inline void partial_lu_decomp(const gene_matrix & X, gene_matrix & C, int N){
     int N2 = N*N;
     BLAS_FUNC(copy)(&N2, X, &intone, C, &intone);
-    char uplo = 'L';
     int info = 0;
     int * ipiv = (int*)alloca(sizeof(int)*N);
     BLAS_FUNC(getrf)(&N, &N, C, &N, ipiv, &info);
@@ -92,7 +91,7 @@
     BLAS_FUNC(trsm)(&right, &lower, &notrans, &nonunit, &N, &N, &fone, L, &N, X, &N);
   }
 
-  static inline void trmm(gene_matrix & A, gene_matrix & B, gene_matrix & X, int N){
+  static inline void trmm(gene_matrix & A, gene_matrix & B, gene_matrix & /*X*/, int N){
     BLAS_FUNC(trmm)(&left, &lower, &notrans,&nonunit, &N,&N,&fone,A,&N,B,&N);
   }
 
@@ -101,7 +100,6 @@
   static inline void lu_decomp(const gene_matrix & X, gene_matrix & C, int N){
     int N2 = N*N;
     BLAS_FUNC(copy)(&N2, X, &intone, C, &intone);
-    char uplo = 'L';
     int info = 0;
     int * ipiv = (int*)alloca(sizeof(int)*N);
     int * jpiv = (int*)alloca(sizeof(int)*N);
@@ -134,8 +132,6 @@
     }
     char uplo = 'U';
     int info = 0;
-    int ilo = 1;
-    int ihi = N;
     int bsize = 64;
     int worksize = N*bsize;
     SCALAR* d = new SCALAR[3*N+worksize];
diff --git a/bench/btl/libs/BLAS/c_interface_base.h b/bench/btl/libs/BLAS/c_interface_base.h
index 515d8dc..de61380 100644
--- a/bench/btl/libs/BLAS/c_interface_base.h
+++ b/bench/btl/libs/BLAS/c_interface_base.h
@@ -17,12 +17,12 @@
   typedef real* gene_matrix;
   typedef real* gene_vector;
 
-  static void free_matrix(gene_matrix & A, int N){
-    delete A;
+  static void free_matrix(gene_matrix & A, int /*N*/){
+    delete[] A;
   }
 
   static void free_vector(gene_vector & B){
-    delete B;
+    delete[] B;
   }
 
   static inline void matrix_from_stl(gene_matrix & A, stl_matrix & A_stl){
diff --git a/bench/btl/libs/BLAS/main.cpp b/bench/btl/libs/BLAS/main.cpp
index 8347c9f..564d55e 100644
--- a/bench/btl/libs/BLAS/main.cpp
+++ b/bench/btl/libs/BLAS/main.cpp
@@ -56,13 +56,13 @@
 
   bench<Action_trmm<blas_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);
 
-  bench<Action_cholesky<blas_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);
-  bench<Action_partial_lu<blas_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);
+  bench<Action_cholesky<blas_interface<REAL_TYPE> > >(MIN_LU,MAX_LU,NB_POINT);
+  bench<Action_partial_lu<blas_interface<REAL_TYPE> > >(MIN_LU,MAX_LU,NB_POINT);
 
   #ifdef HAS_LAPACK
-  bench<Action_lu_decomp<blas_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);
-  bench<Action_hessenberg<blas_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);
-  bench<Action_tridiagonalization<blas_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);
+//   bench<Action_lu_decomp<blas_interface<REAL_TYPE> > >(MIN_LU,MAX_LU,NB_POINT);
+  bench<Action_hessenberg<blas_interface<REAL_TYPE> > >(MIN_LU,MAX_LU,NB_POINT);
+  bench<Action_tridiagonalization<blas_interface<REAL_TYPE> > >(MIN_LU,MAX_LU,NB_POINT);
   #endif
 
   //bench<Action_lu_solve<blas_LU_solve_interface<REAL_TYPE> > >(MIN_LU,MAX_LU,NB_POINT);
diff --git a/bench/btl/libs/STL/STL_interface.hh b/bench/btl/libs/STL/STL_interface.hh
index 93e76bd..ef4cc92 100644
--- a/bench/btl/libs/STL/STL_interface.hh
+++ b/bench/btl/libs/STL/STL_interface.hh
@@ -44,9 +44,9 @@
     return "STL";
   }
 
-  static void free_matrix(gene_matrix & A, int N){}
+  static void free_matrix(gene_matrix & /*A*/, int /*N*/){}
 
-  static void free_vector(gene_vector & B){}
+  static void free_vector(gene_vector & /*B*/){}
 
   static inline void matrix_from_stl(gene_matrix & A, stl_matrix & A_stl){
     A = A_stl;
diff --git a/bench/btl/libs/blaze/CMakeLists.txt b/bench/btl/libs/blaze/CMakeLists.txt
new file mode 100644
index 0000000..e99a085
--- /dev/null
+++ b/bench/btl/libs/blaze/CMakeLists.txt
@@ -0,0 +1,13 @@
+
+find_package(BLAZE)
+find_package(Boost COMPONENTS system)
+if (BLAZE_FOUND AND Boost_FOUND)
+  include_directories(${BLAZE_INCLUDE_DIR} ${Boost_INCLUDE_DIRS})
+  btl_add_bench(btl_blaze main.cpp)
+  # Note: The newest blaze version requires C++14.
+  # Ideally, we should set this depending on the version of Blaze we found
+  set_property(TARGET btl_blaze PROPERTY CXX_STANDARD 14)
+  if(BUILD_btl_blaze)
+    target_link_libraries(btl_blaze ${Boost_LIBRARIES})
+  endif()
+endif ()
diff --git a/bench/btl/libs/blaze/blaze_interface.hh b/bench/btl/libs/blaze/blaze_interface.hh
new file mode 100644
index 0000000..ee15239
--- /dev/null
+++ b/bench/btl/libs/blaze/blaze_interface.hh
@@ -0,0 +1,140 @@
+//=====================================================
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
+//=====================================================
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+//
+#ifndef BLAZE_INTERFACE_HH
+#define BLAZE_INTERFACE_HH
+
+#include <blaze/Math.h>
+#include <blaze/Blaze.h>
+// using namespace blaze;
+
+#include <vector>
+
+template<class real>
+class blaze_interface {
+
+public :
+
+  typedef real real_type ;
+
+  typedef std::vector<real>        stl_vector;
+  typedef std::vector<stl_vector > stl_matrix;
+
+  typedef blaze::DynamicMatrix<real,blaze::columnMajor>  gene_matrix;
+  typedef blaze::DynamicVector<real>  gene_vector;
+
+  static inline std::string name() { return "blaze"; }
+
+  static void free_matrix(gene_matrix & A, int N){
+    return ;
+  }
+
+  static void free_vector(gene_vector & B){
+    return ;
+  }
+
+  static inline void matrix_from_stl(gene_matrix & A, stl_matrix & A_stl){
+    A.resize(A_stl[0].size(), A_stl.size());
+
+    for (int j=0; j<A_stl.size() ; j++){
+      for (int i=0; i<A_stl[j].size() ; i++){
+        A(i,j) = A_stl[j][i];
+      }
+    }
+  }
+
+  static inline void vector_from_stl(gene_vector & B, stl_vector & B_stl){
+    B.resize(B_stl.size());
+    for (int i=0; i<B_stl.size() ; i++){
+      B[i] = B_stl[i];
+    }
+  }
+
+  static inline void vector_to_stl(gene_vector & B, stl_vector & B_stl){
+    for (int i=0; i<B_stl.size() ; i++){
+      B_stl[i] = B[i];
+    }
+  }
+
+  static inline void matrix_to_stl(gene_matrix & A, stl_matrix & A_stl){
+    int N=A_stl.size();
+    for (int j=0;j<N;j++){
+      A_stl[j].resize(N);
+      for (int i=0;i<N;i++){
+        A_stl[j][i] = A(i,j);
+      }
+    }
+  }
+
+  static inline void matrix_matrix_product(const gene_matrix & A, const gene_matrix & B, gene_matrix & X, int N){
+    X = (A*B);
+  }
+
+  static inline void transposed_matrix_matrix_product(const gene_matrix & A, const gene_matrix & B, gene_matrix & X, int N){
+    X = (trans(A)*trans(B));
+  }
+
+  static inline void ata_product(const gene_matrix & A, gene_matrix & X, int N){
+    X = (trans(A)*A);
+  }
+
+  static inline void aat_product(const gene_matrix & A, gene_matrix & X, int N){
+    X = (A*trans(A));
+  }
+
+  static inline void matrix_vector_product(gene_matrix & A, gene_vector & B, gene_vector & X, int N){
+    X = (A*B);
+  }
+
+  static inline void atv_product(gene_matrix & A, gene_vector & B, gene_vector & X, int N){
+    X = (trans(A)*B);
+  }
+
+  static inline void axpy(const real coef, const gene_vector & X, gene_vector & Y, int N){
+    Y += coef * X;
+  }
+
+  static inline void axpby(real a, const gene_vector & X, real b, gene_vector & Y, int N){
+    Y = a*X + b*Y;
+  }
+
+//   static inline void cholesky(const gene_matrix & X, gene_matrix & C, int N){
+//     C = X;
+//     recursive_cholesky(C);
+//   }
+
+//   static inline void lu_decomp(const gene_matrix & X, gene_matrix & R, int N){
+//     R = X;
+//     std::vector<int> ipvt(N);
+//     lu_factor(R, ipvt);
+//   }
+
+//   static inline void trisolve_lower(const gene_matrix & L, const gene_vector& B, gene_vector & X, int N){
+//     X = lower_trisolve(L, B);
+//   }
+
+  static inline void copy_matrix(const gene_matrix & source, gene_matrix & cible, int N){
+    cible = source;
+  }
+
+  static inline void copy_vector(const gene_vector & source, gene_vector & cible, int N){
+    cible = source;
+  }
+
+};
+
+#endif
diff --git a/bench/btl/libs/blaze/main.cpp b/bench/btl/libs/blaze/main.cpp
new file mode 100644
index 0000000..80e8f4e
--- /dev/null
+++ b/bench/btl/libs/blaze/main.cpp
@@ -0,0 +1,40 @@
+//=====================================================
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
+//=====================================================
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+//
+#include "utilities.h"
+#include "blaze_interface.hh"
+#include "bench.hh"
+#include "basic_actions.hh"
+
+BTL_MAIN;
+
+int main()
+{
+
+  bench<Action_axpy<blaze_interface<REAL_TYPE> > >(MIN_AXPY,MAX_AXPY,NB_POINT);
+  bench<Action_axpby<blaze_interface<REAL_TYPE> > >(MIN_AXPY,MAX_AXPY,NB_POINT);
+
+  bench<Action_matrix_vector_product<blaze_interface<REAL_TYPE> > >(MIN_MV,MAX_MV,NB_POINT);
+  bench<Action_atv_product<blaze_interface<REAL_TYPE> > >(MIN_MV,MAX_MV,NB_POINT);
+//   bench<Action_matrix_matrix_product<blaze_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);
+//   bench<Action_ata_product<blaze_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);
+//   bench<Action_aat_product<blaze_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);
+
+  return 0;
+}
+
+
diff --git a/bench/btl/libs/eigen2/eigen2_interface.hh b/bench/btl/libs/eigen2/eigen2_interface.hh
index 47fe581..1deabda 100644
--- a/bench/btl/libs/eigen2/eigen2_interface.hh
+++ b/bench/btl/libs/eigen2/eigen2_interface.hh
@@ -47,7 +47,7 @@
   {
     #if defined(EIGEN_VECTORIZE_SSE)
     if (SIZE==Dynamic) return "eigen2"; else return "tiny_eigen2";
-    #elif defined(EIGEN_VECTORIZE_ALTIVEC)
+    #elif defined(EIGEN_VECTORIZE_ALTIVEC) || defined(EIGEN_VECTORIZE_VSX)
     if (SIZE==Dynamic) return "eigen2"; else return "tiny_eigen2";
     #else
     if (SIZE==Dynamic) return "eigen2_novec"; else return "tiny_eigen2_novec";
diff --git a/bench/btl/libs/eigen3/eigen3_interface.hh b/bench/btl/libs/eigen3/eigen3_interface.hh
index 31bcc1f..b821fd7 100644
--- a/bench/btl/libs/eigen3/eigen3_interface.hh
+++ b/bench/btl/libs/eigen3/eigen3_interface.hh
@@ -45,15 +45,15 @@
     return EIGEN_MAKESTRING(BTL_PREFIX);
   }
 
-  static void free_matrix(gene_matrix & A, int N) {}
+  static void free_matrix(gene_matrix & /*A*/, int /*N*/) {}
 
-  static void free_vector(gene_vector & B) {}
+  static void free_vector(gene_vector & /*B*/) {}
 
   static BTL_DONT_INLINE void matrix_from_stl(gene_matrix & A, stl_matrix & A_stl){
     A.resize(A_stl[0].size(), A_stl.size());
 
-    for (int j=0; j<A_stl.size() ; j++){
-      for (int i=0; i<A_stl[j].size() ; i++){
+    for (unsigned int j=0; j<A_stl.size() ; j++){
+      for (unsigned int i=0; i<A_stl[j].size() ; i++){
         A.coeffRef(i,j) = A_stl[j][i];
       }
     }
@@ -62,19 +62,19 @@
   static BTL_DONT_INLINE  void vector_from_stl(gene_vector & B, stl_vector & B_stl){
     B.resize(B_stl.size(),1);
 
-    for (int i=0; i<B_stl.size() ; i++){
+    for (unsigned int i=0; i<B_stl.size() ; i++){
       B.coeffRef(i) = B_stl[i];
     }
   }
 
   static BTL_DONT_INLINE  void vector_to_stl(gene_vector & B, stl_vector & B_stl){
-    for (int i=0; i<B_stl.size() ; i++){
+    for (unsigned int i=0; i<B_stl.size() ; i++){
       B_stl[i] = B.coeff(i);
     }
   }
 
   static BTL_DONT_INLINE  void matrix_to_stl(gene_matrix & A, stl_matrix & A_stl){
-    int N=A_stl.size();
+    int  N=A_stl.size();
 
     for (int j=0;j<N;j++){
       A_stl[j].resize(N);
@@ -84,28 +84,28 @@
     }
   }
 
-  static inline void matrix_matrix_product(const gene_matrix & A, const gene_matrix & B, gene_matrix & X, int N){
+  static inline void matrix_matrix_product(const gene_matrix & A, const gene_matrix & B, gene_matrix & X, int  /*N*/){
     X.noalias() = A*B;
   }
 
-  static inline void transposed_matrix_matrix_product(const gene_matrix & A, const gene_matrix & B, gene_matrix & X, int N){
+  static inline void transposed_matrix_matrix_product(const gene_matrix & A, const gene_matrix & B, gene_matrix & X, int  /*N*/){
     X.noalias() = A.transpose()*B.transpose();
   }
 
-//   static inline void ata_product(const gene_matrix & A, gene_matrix & X, int N){
+//   static inline void ata_product(const gene_matrix & A, gene_matrix & X, int  /*N*/){
 //     X.noalias() = A.transpose()*A;
 //   }
 
-  static inline void aat_product(const gene_matrix & A, gene_matrix & X, int N){
+  static inline void aat_product(const gene_matrix & A, gene_matrix & X, int  /*N*/){
     X.template triangularView<Lower>().setZero();
     X.template selfadjointView<Lower>().rankUpdate(A);
   }
 
-  static inline void matrix_vector_product(const gene_matrix & A, const gene_vector & B, gene_vector & X, int N){
+  static inline void matrix_vector_product(const gene_matrix & A, const gene_vector & B, gene_vector & X, int  /*N*/){
     X.noalias() = A*B;
   }
 
-  static inline void symv(const gene_matrix & A, const gene_vector & B, gene_vector & X, int N){
+  static inline void symv(const gene_matrix & A, const gene_vector & B, gene_vector & X, int  /*N*/){
     X.noalias() = (A.template selfadjointView<Lower>() * B);
 //     internal::product_selfadjoint_vector<real,0,LowerTriangularBit,false,false>(N,A.data(),N, B.data(), 1, X.data(), 1);
   }
@@ -155,54 +155,54 @@
     }
   }
 
-  static EIGEN_DONT_INLINE void syr2(gene_matrix & A,  gene_vector & X, gene_vector & Y, int N){
+  static EIGEN_DONT_INLINE void syr2(gene_matrix & A,  gene_vector & X, gene_vector & Y, int  N){
     // internal::product_selfadjoint_rank2_update<real,0,LowerTriangularBit>(N,A.data(),N, X.data(), 1, Y.data(), 1, -1);
     for(int j=0; j<N; ++j)
       A.col(j).tail(N-j) += X[j] * Y.tail(N-j) + Y[j] * X.tail(N-j);
   }
 
-  static EIGEN_DONT_INLINE void ger(gene_matrix & A,  gene_vector & X, gene_vector & Y, int N){
+  static EIGEN_DONT_INLINE void ger(gene_matrix & A,  gene_vector & X, gene_vector & Y, int  N){
     for(int j=0; j<N; ++j)
       A.col(j) += X * Y[j];
   }
 
-  static EIGEN_DONT_INLINE void rot(gene_vector & A,  gene_vector & B, real c, real s, int N){
+  static EIGEN_DONT_INLINE void rot(gene_vector & A,  gene_vector & B, real c, real s, int  /*N*/){
     internal::apply_rotation_in_the_plane(A, B, JacobiRotation<real>(c,s));
   }
 
-  static inline void atv_product(gene_matrix & A, gene_vector & B, gene_vector & X, int N){
+  static inline void atv_product(gene_matrix & A, gene_vector & B, gene_vector & X, int  /*N*/){
     X.noalias() = (A.transpose()*B);
   }
 
-  static inline void axpy(real coef, const gene_vector & X, gene_vector & Y, int N){
+  static inline void axpy(real coef, const gene_vector & X, gene_vector & Y, int  /*N*/){
     Y += coef * X;
   }
 
-  static inline void axpby(real a, const gene_vector & X, real b, gene_vector & Y, int N){
+  static inline void axpby(real a, const gene_vector & X, real b, gene_vector & Y, int  /*N*/){
     Y = a*X + b*Y;
   }
 
-  static EIGEN_DONT_INLINE void copy_matrix(const gene_matrix & source, gene_matrix & cible, int N){
+  static EIGEN_DONT_INLINE void copy_matrix(const gene_matrix & source, gene_matrix & cible, int  /*N*/){
     cible = source;
   }
 
-  static EIGEN_DONT_INLINE void copy_vector(const gene_vector & source, gene_vector & cible, int N){
+  static EIGEN_DONT_INLINE void copy_vector(const gene_vector & source, gene_vector & cible, int  /*N*/){
     cible = source;
   }
 
-  static inline void trisolve_lower(const gene_matrix & L, const gene_vector& B, gene_vector& X, int N){
+  static inline void trisolve_lower(const gene_matrix & L, const gene_vector& B, gene_vector& X, int  /*N*/){
     X = L.template triangularView<Lower>().solve(B);
   }
 
-  static inline void trisolve_lower_matrix(const gene_matrix & L, const gene_matrix& B, gene_matrix& X, int N){
+  static inline void trisolve_lower_matrix(const gene_matrix & L, const gene_matrix& B, gene_matrix& X, int  /*N*/){
     X = L.template triangularView<Upper>().solve(B);
   }
 
-  static inline void trmm(const gene_matrix & L, const gene_matrix& B, gene_matrix& X, int N){
+  static inline void trmm(const gene_matrix & L, const gene_matrix& B, gene_matrix& X, int  /*N*/){
     X.noalias() = L.template triangularView<Lower>() * B;
   }
 
-  static inline void cholesky(const gene_matrix & X, gene_matrix & C, int N){
+  static inline void cholesky(const gene_matrix & X, gene_matrix & C, int  /*N*/){
     C = X;
     internal::llt_inplace<real,Lower>::blocked(C);
     //C = X.llt().matrixL();
@@ -211,11 +211,11 @@
 //     Cholesky<gene_matrix>::computeInPlaceBlock(C);
   }
 
-  static inline void lu_decomp(const gene_matrix & X, gene_matrix & C, int N){
+  static inline void lu_decomp(const gene_matrix & X, gene_matrix & C, int  /*N*/){
     C = X.fullPivLu().matrixLU();
   }
 
-  static inline void partial_lu_decomp(const gene_matrix & X, gene_matrix & C, int N){
+  static inline void partial_lu_decomp(const gene_matrix & X, gene_matrix & C, int  N){
     Matrix<DenseIndex,1,Dynamic> piv(N);
     DenseIndex nb;
     C = X;
@@ -223,13 +223,13 @@
 //     C = X.partialPivLu().matrixLU();
   }
 
-  static inline void tridiagonalization(const gene_matrix & X, gene_matrix & C, int N){
+  static inline void tridiagonalization(const gene_matrix & X, gene_matrix & C, int  N){
     typename Tridiagonalization<gene_matrix>::CoeffVectorType aux(N-1);
     C = X;
     internal::tridiagonalization_inplace(C, aux);
   }
 
-  static inline void hessenberg(const gene_matrix & X, gene_matrix & C, int N){
+  static inline void hessenberg(const gene_matrix & X, gene_matrix & C, int  /*N*/){
     C = HessenbergDecomposition<gene_matrix>(X).packedMatrix();
   }
 
diff --git a/bench/btl/libs/eigen3/main_adv.cpp b/bench/btl/libs/eigen3/main_adv.cpp
index efe5857..9586535 100644
--- a/bench/btl/libs/eigen3/main_adv.cpp
+++ b/bench/btl/libs/eigen3/main_adv.cpp
@@ -29,14 +29,14 @@
 
 int main()
 {
-  bench<Action_trisolve<eigen3_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);
-  bench<Action_trisolve_matrix<eigen3_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);
-  bench<Action_cholesky<eigen3_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);
-  bench<Action_lu_decomp<eigen3_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);
-  bench<Action_partial_lu<eigen3_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);
+  bench<Action_trisolve<eigen3_interface<REAL_TYPE> > >(MIN_LU,MAX_LU,NB_POINT);
+  bench<Action_trisolve_matrix<eigen3_interface<REAL_TYPE> > >(MIN_LU,MAX_LU,NB_POINT);
+  bench<Action_cholesky<eigen3_interface<REAL_TYPE> > >(MIN_LU,MAX_LU,NB_POINT);
+//   bench<Action_lu_decomp<eigen3_interface<REAL_TYPE> > >(MIN_LU,MAX_LU,NB_POINT);
+  bench<Action_partial_lu<eigen3_interface<REAL_TYPE> > >(MIN_LU,MAX_LU,NB_POINT);
 
-  bench<Action_hessenberg<eigen3_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);
-  bench<Action_tridiagonalization<eigen3_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);
+//   bench<Action_hessenberg<eigen3_interface<REAL_TYPE> > >(MIN_LU,MAX_LU,NB_POINT);
+  bench<Action_tridiagonalization<eigen3_interface<REAL_TYPE> > >(MIN_LU,MAX_LU,NB_POINT);
 
   return 0;
 }
diff --git a/bench/btl/libs/tensors/CMakeLists.txt b/bench/btl/libs/tensors/CMakeLists.txt
new file mode 100644
index 0000000..09d6d8e
--- /dev/null
+++ b/bench/btl/libs/tensors/CMakeLists.txt
@@ -0,0 +1,44 @@
+
+
+if((NOT TENSOR_INCLUDE_DIR) AND Eigen_SOURCE_DIR)
+  # unless TENSOR_INCLUDE_DIR is defined, let's use current Eigen version
+  set(TENSOR_INCLUDE_DIR ${Eigen_SOURCE_DIR})
+  set(TENSOR_FOUND TRUE)
+else()
+  find_package(Tensor)
+endif()
+
+if (TENSOR_FOUND)
+
+  include_directories(${TENSOR_INCLUDE_DIR})
+  btl_add_bench(btl_tensor_linear main_linear.cpp)
+  btl_add_bench(btl_tensor_vecmat main_vecmat.cpp)
+  btl_add_bench(btl_tensor_matmat main_matmat.cpp)
+
+  btl_add_target_property(btl_tensor_linear COMPILE_FLAGS "-fno-exceptions -DBTL_PREFIX=tensor")
+  btl_add_target_property(btl_tensor_vecmat COMPILE_FLAGS "-fno-exceptions -DBTL_PREFIX=tensor")
+  btl_add_target_property(btl_tensor_matmat COMPILE_FLAGS "-fno-exceptions -DBTL_PREFIX=tensor")
+
+  option(BTL_BENCH_NOGCCVEC "also bench Eigen explicit vec without GCC's auto vec" OFF)
+  if(CMAKE_COMPILER_IS_GNUCXX AND BTL_BENCH_NOGCCVEC)
+    btl_add_bench(btl_tensor_nogccvec_linear main_linear.cpp)
+    btl_add_bench(btl_tensor_nogccvec_vecmat main_vecmat.cpp)
+    btl_add_bench(btl_tensor_nogccvec_matmat main_matmat.cpp)
+
+    btl_add_target_property(btl_tensor_nogccvec_linear COMPILE_FLAGS "-fno-exceptions -fno-tree-vectorize -DBTL_PREFIX=tensor_nogccvec")
+    btl_add_target_property(btl_tensor_nogccvec_vecmat COMPILE_FLAGS "-fno-exceptions -fno-tree-vectorize -DBTL_PREFIX=tensor_nogccvec")
+    btl_add_target_property(btl_tensor_nogccvec_matmat COMPILE_FLAGS "-fno-exceptions -fno-tree-vectorize -DBTL_PREFIX=tensor_nogccvec")
+  endif()
+
+
+  if(NOT BTL_NOVEC)
+    btl_add_bench(btl_tensor_novec_linear main_linear.cpp OFF)
+    btl_add_bench(btl_tensor_novec_vecmat main_vecmat.cpp OFF)
+    btl_add_bench(btl_tensor_novec_matmat main_matmat.cpp OFF)
+    btl_add_target_property(btl_tensor_novec_linear COMPILE_FLAGS "-fno-exceptions -DEIGEN_DONT_VECTORIZE -DBTL_PREFIX=tensor_novec")
+    btl_add_target_property(btl_tensor_novec_vecmat COMPILE_FLAGS "-fno-exceptions -DEIGEN_DONT_VECTORIZE -DBTL_PREFIX=tensor_novec")
+    btl_add_target_property(btl_tensor_novec_matmat COMPILE_FLAGS "-fno-exceptions -DEIGEN_DONT_VECTORIZE -DBTL_PREFIX=tensor_novec")
+
+  endif(NOT BTL_NOVEC)
+
+endif (TENSOR_FOUND)
diff --git a/bench/btl/libs/tensors/main_linear.cpp b/bench/btl/libs/tensors/main_linear.cpp
new file mode 100644
index 0000000..e257f1e
--- /dev/null
+++ b/bench/btl/libs/tensors/main_linear.cpp
@@ -0,0 +1,23 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2014 Benoit Steiner <benoit.steiner.goog@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#include "utilities.h"
+#include "tensor_interface.hh"
+#include "bench.hh"
+#include "basic_actions.hh"
+
+BTL_MAIN;
+
+int main()
+{
+  bench<Action_axpy<tensor_interface<REAL_TYPE> > >(MIN_AXPY,MAX_AXPY,NB_POINT);
+  bench<Action_axpby<tensor_interface<REAL_TYPE> > >(MIN_AXPY,MAX_AXPY,NB_POINT);
+
+  return 0;
+}
diff --git a/bench/btl/libs/tensors/main_matmat.cpp b/bench/btl/libs/tensors/main_matmat.cpp
new file mode 100644
index 0000000..675fcfc
--- /dev/null
+++ b/bench/btl/libs/tensors/main_matmat.cpp
@@ -0,0 +1,21 @@
+//=====================================================
+// Copyright (C) 2014 Benoit Steiner <benoit.steiner.goog@gmail.com>
+//=====================================================
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+//
+#include "utilities.h"
+#include "tensor_interface.hh"
+#include "bench.hh"
+#include "basic_actions.hh"
+
+BTL_MAIN;
+
+int main()
+{
+  bench<Action_matrix_matrix_product<tensor_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);
+
+  return 0;
+}
diff --git a/bench/btl/libs/tensors/main_vecmat.cpp b/bench/btl/libs/tensors/main_vecmat.cpp
new file mode 100644
index 0000000..1af00c8
--- /dev/null
+++ b/bench/btl/libs/tensors/main_vecmat.cpp
@@ -0,0 +1,21 @@
+//=====================================================
+// Copyright (C) 2014 Benoit Steiner <benoit.steiner.goog@gmail.com>
+//=====================================================
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+//
+#include "utilities.h"
+#include "tensor_interface.hh"
+#include "bench.hh"
+#include "basic_actions.hh"
+
+BTL_MAIN;
+
+int main()
+{
+  bench<Action_matrix_vector_product<tensor_interface<REAL_TYPE> > >(MIN_MV,MAX_MV,NB_POINT);
+
+  return 0;
+}
diff --git a/bench/btl/libs/tensors/tensor_interface.hh b/bench/btl/libs/tensors/tensor_interface.hh
new file mode 100644
index 0000000..97b8e0f
--- /dev/null
+++ b/bench/btl/libs/tensors/tensor_interface.hh
@@ -0,0 +1,105 @@
+//=====================================================
+// Copyright (C) 2014 Benoit Steiner <benoit.steiner.goog@gmail.com>
+//=====================================================
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+//
+#ifndef TENSOR_INTERFACE_HH
+#define TENSOR_INTERFACE_HH
+
+#include <unsupported/Eigen/CXX11/Tensor>
+#include <vector>
+#include "btl.hh"
+
+using namespace Eigen;
+
+template<class real>
+class tensor_interface
+{
+public :
+  typedef real real_type;
+  typedef typename Eigen::Tensor<real,2>::Index Index;
+
+  typedef std::vector<real> stl_vector;
+  typedef std::vector<stl_vector> stl_matrix;
+
+  typedef Eigen::Tensor<real,2> gene_matrix;
+  typedef Eigen::Tensor<real,1> gene_vector;
+
+
+  static inline std::string name( void )
+  {
+    return EIGEN_MAKESTRING(BTL_PREFIX);
+  }
+
+  static void free_matrix(gene_matrix & /*A*/, int /*N*/) {}
+
+  static void free_vector(gene_vector & /*B*/) {}
+
+  static BTL_DONT_INLINE void matrix_from_stl(gene_matrix & A, stl_matrix & A_stl){
+    A.resize(Eigen::array<Index,2>(A_stl[0].size(), A_stl.size()));
+
+    for (unsigned int j=0; j<A_stl.size() ; j++){
+      for (unsigned int i=0; i<A_stl[j].size() ; i++){
+        A.coeffRef(Eigen::array<Index,2>(i,j)) = A_stl[j][i];
+      }
+    }
+  }
+
+  static BTL_DONT_INLINE  void vector_from_stl(gene_vector & B, stl_vector & B_stl){
+    B.resize(B_stl.size());
+
+    for (unsigned int i=0; i<B_stl.size() ; i++){
+      B.coeffRef(i) = B_stl[i];
+    }
+  }
+
+  static BTL_DONT_INLINE  void vector_to_stl(gene_vector & B, stl_vector & B_stl){
+    for (unsigned int i=0; i<B_stl.size() ; i++){
+      B_stl[i] = B.coeff(i);
+    }
+  }
+
+  static BTL_DONT_INLINE  void matrix_to_stl(gene_matrix & A, stl_matrix & A_stl){
+    int  N=A_stl.size();
+
+    for (int j=0;j<N;j++){
+      A_stl[j].resize(N);
+      for (int i=0;i<N;i++){
+        A_stl[j][i] = A.coeff(Eigen::array<Index,2>(i,j));
+      }
+    }
+  }
+
+  static inline void matrix_matrix_product(const gene_matrix & A, const gene_matrix & B, gene_matrix & X, int  /*N*/){
+    typedef typename Eigen::Tensor<real_type, 1>::DimensionPair DimPair;
+    const Eigen::array<DimPair, 1> dims(DimPair(1, 0));
+    X/*.noalias()*/ = A.contract(B, dims);
+  }
+
+  static inline void matrix_vector_product(const gene_matrix & A, const gene_vector & B, gene_vector & X, int  /*N*/){
+    typedef typename Eigen::Tensor<real_type, 1>::DimensionPair DimPair;
+    const Eigen::array<DimPair, 1> dims(DimPair(1, 0));
+    X/*.noalias()*/ = A.contract(B, dims);
+  }
+
+  static inline void axpy(real coef, const gene_vector & X, gene_vector & Y, int  /*N*/){
+    Y += X.constant(coef) * X;
+  }
+
+  static inline void axpby(real a, const gene_vector & X, real b, gene_vector & Y, int  /*N*/){
+    Y = X.constant(a)*X + Y.constant(b)*Y;
+  }
+
+  static EIGEN_DONT_INLINE void copy_matrix(const gene_matrix & source, gene_matrix & cible, int  /*N*/){
+    cible = source;
+  }
+
+  static EIGEN_DONT_INLINE void copy_vector(const gene_vector & source, gene_vector & cible, int  /*N*/){
+    cible = source;
+  }
+};
+
+#endif