From 1cb5a6061ce4b7f0cf5a9e5938bc1a11fe24b9ca Mon Sep 17 00:00:00 2001 From: Tim Rowley Date: Fri, 7 Jul 2017 13:58:09 -0500 Subject: [PATCH] configure/swr: add KNL and SKX architecture targets Not built by default. Currently only builds with icc. v2: * document knl,skx possibilities for swr_archs * merge with changed loader lib selection code Reviewed-by: Emil Velikov --- configure.ac | 22 ++++++++++++++++++-- src/gallium/drivers/swr/Makefile.am | 38 ++++++++++++++++++++++++++++++++++ src/gallium/drivers/swr/swr_loader.cpp | 20 ++++++++++++++++++ 3 files changed, 78 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index cfc53de..38cd127 100644 --- a/configure.ac +++ b/configure.ac @@ -2357,7 +2357,7 @@ dnl Architectures to build SWR library for AC_ARG_WITH([swr-archs], [AS_HELP_STRING([--with-swr-archs@<:@=DIRS...@:>@], [comma delimited swr architectures list, e.g. - "avx,avx2" @<:@default="avx,avx2"@:>@])], + "avx,avx2,knl,skx" @<:@default="avx,avx2"@:>@])], [with_swr_archs="$withval"], [with_swr_archs="avx,avx2"]) @@ -2521,6 +2521,20 @@ if test -n "$with_gallium_drivers"; then AC_SUBST([SWR_AVX2_CXXFLAGS]) HAVE_SWR_AVX2=yes ;; + xknl) + swr_require_cxx_feature_flags "KNL" "defined(__AVX512F__) && defined(__AVX512ER__)" \ + ",-march=knl,-xMIC-AVX512" \ + SWR_KNL_CXXFLAGS + AC_SUBST([SWR_KNL_CXXFLAGS]) + HAVE_SWR_KNL=yes + ;; + xskx) + swr_require_cxx_feature_flags "SKX" "defined(__AVX512F__) && defined(__AVX512BW__)" \ + ",-march=skylake-avx512,-xCORE-AVX512" \ + SWR_SKX_CXXFLAGS + AC_SUBST([SWR_SKX_CXXFLAGS]) + HAVE_SWR_SKX=yes + ;; *) AC_MSG_ERROR([unknown SWR build architecture '$arch']) ;; @@ -2528,7 +2542,9 @@ if test -n "$with_gallium_drivers"; then done if test "x$HAVE_SWR_AVX" != xyes -a \ - "x$HAVE_SWR_AVX2" != xyes; then + "x$HAVE_SWR_AVX2" != xyes -a \ + "x$HAVE_SWR_KNL" != xyes -a \ + "x$HAVE_SWR_SKX" != xyes -a; then AC_MSG_ERROR([swr enabled but no swr architectures selected]) fi @@ -2571,6 +2587,8 @@ fi AM_CONDITIONAL(HAVE_SWR_AVX, test "x$HAVE_SWR_AVX" = xyes) AM_CONDITIONAL(HAVE_SWR_AVX2, test "x$HAVE_SWR_AVX2" = xyes) +AM_CONDITIONAL(HAVE_SWR_KNL, test "x$HAVE_SWR_KNL" = xyes) +AM_CONDITIONAL(HAVE_SWR_SKX, test "x$HAVE_SWR_SKX" = xyes) dnl We need to validate some needed dependencies for renderonly drivers. diff --git a/src/gallium/drivers/swr/Makefile.am b/src/gallium/drivers/swr/Makefile.am index f38ce7b..6495021 100644 --- a/src/gallium/drivers/swr/Makefile.am +++ b/src/gallium/drivers/swr/Makefile.am @@ -63,6 +63,14 @@ if HAVE_SWR_AVX2 libmesaswr_la_CXXFLAGS += -DHAVE_SWR_AVX2 endif +if HAVE_SWR_KNL +libmesaswr_la_CXXFLAGS += -DHAVE_SWR_KNL +endif + +if HAVE_SWR_SKX +libmesaswr_la_CXXFLAGS += -DHAVE_SWR_SKX +endif + COMMON_SOURCES = \ $(ARCHRAST_CXX_SOURCES) \ $(COMMON_CXX_SOURCES) \ @@ -263,6 +271,36 @@ libswrAVX2_la_LDFLAGS = \ $(COMMON_LDFLAGS) endif +if HAVE_SWR_KNL +lib_LTLIBRARIES += libswrKNL.la + +libswrKNL_la_CXXFLAGS = \ + $(SWR_KNL_CXXFLAGS) \ + -DKNOB_ARCH=KNOB_ARCH_AVX512 -DAVX512F_STRICT \ + $(COMMON_CXXFLAGS) + +libswrKNL_la_SOURCES = \ + $(COMMON_SOURCES) + +libswrKNL_la_LDFLAGS = \ + $(COMMON_LDFLAGS) +endif + +if HAVE_SWR_SKX +lib_LTLIBRARIES += libswrSKX.la + +libswrSKX_la_CXXFLAGS = \ + $(SWR_SKX_CXXFLAGS) \ + -DKNOB_ARCH=KNOB_ARCH_AVX512 \ + $(COMMON_CXXFLAGS) + +libswrSKX_la_SOURCES = \ + $(COMMON_SOURCES) + +libswrSKX_la_LDFLAGS = \ + $(COMMON_LDFLAGS) +endif + include $(top_srcdir)/install-gallium-links.mk # Generated gen_builder.hpp is not backwards compatible. So ship only one diff --git a/src/gallium/drivers/swr/swr_loader.cpp b/src/gallium/drivers/swr/swr_loader.cpp index 4aa850a..e205fe2 100644 --- a/src/gallium/drivers/swr/swr_loader.cpp +++ b/src/gallium/drivers/swr/swr_loader.cpp @@ -38,6 +38,26 @@ swr_create_screen(struct sw_winsys *winsys) util_cpu_detect(); + if (!strlen(filename) && + util_cpu_caps.has_avx512f && util_cpu_caps.has_avx512er) { +#if HAVE_SWR_KNL + fprintf(stderr, "KNL "); + sprintf(filename, "%s%s%s", UTIL_DL_PREFIX, "swrKNL", UTIL_DL_EXT); +#else + fprintf(stderr, "KNL (not built) "); +#endif + } + + if (!strlen(filename) && + util_cpu_caps.has_avx512f && util_cpu_caps.has_avx512bw) { +#if HAVE_SWR_SKX + fprintf(stderr, "SKX "); + sprintf(filename, "%s%s%s", UTIL_DL_PREFIX, "swrSKX", UTIL_DL_EXT); +#else + fprintf(stderr, "SKX (not built) "); +#endif + } + if (!strlen(filename) && util_cpu_caps.has_avx2) { #if HAVE_SWR_AVX2 fprintf(stderr, "AVX2 "); -- 2.7.4