From 153aeaeec6354525025d453eb76d3159f8c9dcd3 Mon Sep 17 00:00:00 2001
From: Vasileios Karakasis <vkarak@gmail.com>
Date: Thu, 15 Jun 2017 08:48:00 +0200
Subject: [PATCH] AVX512 CMake target (#288)

Adds a new AVX512 target for processors supporting only the core AVX512 functionality, which currently means SkyLake Xeon processors.
---
 CMakeLists.txt              | 6 ++++--
 cmake/CompilerOptions.cmake | 8 +++++---
 mechanisms/CMakeLists.txt   | 2 ++
 3 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index be8d1dec..a94f61ab 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -178,8 +178,8 @@ endif()
 #----------------------------------------------------------
 # vectorization target
 #----------------------------------------------------------
-set(NMC_VECTORIZE_TARGET "none" CACHE STRING "CPU target for vectorization {KNL,AVX,AVX2}")
-set_property(CACHE NMC_VECTORIZE_TARGET PROPERTY STRINGS none KNL AVX AVX2)
+set(NMC_VECTORIZE_TARGET "none" CACHE STRING "CPU target for vectorization {KNL,AVX,AVX2,AVX512}")
+set_property(CACHE NMC_VECTORIZE_TARGET PROPERTY STRINGS none KNL AVX AVX2 AVX512)
 
 if(NMC_VECTORIZE_TARGET STREQUAL "KNL")
     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXXOPT_KNL}")
@@ -187,6 +187,8 @@ elseif(NMC_VECTORIZE_TARGET STREQUAL "AVX")
     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXXOPT_AVX}")
 elseif(NMC_VECTORIZE_TARGET STREQUAL "AVX2")
     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXXOPT_AVX2}")
+elseif(NMC_VECTORIZE_TARGET STREQUAL "AVX512")
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXXOPT_AVX512}")
 endif()
 
 #----------------------------------------------------------
diff --git a/cmake/CompilerOptions.cmake b/cmake/CompilerOptions.cmake
index c3982b94..b15e252a 100644
--- a/cmake/CompilerOptions.cmake
+++ b/cmake/CompilerOptions.cmake
@@ -27,7 +27,8 @@ if(${CMAKE_CXX_COMPILER_ID} MATCHES "GNU")
     # supported in gcc 4.9.x and later.
     set(CXXOPT_KNL "-march=knl")
     set(CXXOPT_AVX "-mavx")
-    set(CXXOPT_AVX2 "-march=core-avx2")
+    set(CXXOPT_AVX2 "-mavx2")
+    set(CXXOPT_AVX512 "-mavx512f -mavx512cd")
 
     # Disable 'maybe-uninitialized' warning: this will be raised
     # inappropriately in some uses of util::optional<T> when T
@@ -42,7 +43,8 @@ if(${CMAKE_CXX_COMPILER_ID} MATCHES "Intel")
 
     # Compiler flags for generating KNL-specific AVX512 instructions.
     set(CXXOPT_KNL "-xMIC-AVX512")
-    set(CXXOPT_AVX "-mavx")
-    set(CXXOPT_AVX2 "-march=core-avx2")
+    set(CXXOPT_AVX "-xAVX")
+    set(CXXOPT_AVX2 "-xCORE-AVX2")
+    set(CXXOPT_AVX512 "-xCORE-AVX512")
 endif()
 
diff --git a/mechanisms/CMakeLists.txt b/mechanisms/CMakeLists.txt
index ace0936e..569f85a5 100644
--- a/mechanisms/CMakeLists.txt
+++ b/mechanisms/CMakeLists.txt
@@ -16,6 +16,8 @@ elseif(NMC_VECTORIZE_TARGET STREQUAL "AVX")
     set(modcc_target "cpu")
 elseif(NMC_VECTORIZE_TARGET STREQUAL "AVX2")
     set(modcc_target "avx2")
+elseif(NMC_VECTORIZE_TARGET STREQUAL "AVX512")
+    set(modcc_target "avx512")
 else()
     set(modcc_target "cpu")
 endif()
-- 
GitLab