Test for SSE4 instructions on the host before enabling them in the python extension module.

This commit is contained in:
Davis King 2018-06-10 09:04:34 -04:00
parent dcebe3391e
commit 653d048370
5 changed files with 68 additions and 2 deletions

View File

@ -0,0 +1,19 @@
# This script checks if your compiler and host processor can generate and then run programs with SSE4 instructions.
cmake_minimum_required(VERSION 2.8.12)
# Don't rerun this script if its already been executed.
if (DEFINED SSE4_IS_AVAILABLE_ON_HOST)
return()
endif()
# Set to false unless we find out otherwise in the code below.
set(SSE4_IS_AVAILABLE_ON_HOST 0)
try_compile(test_for_sse4_worked ${PROJECT_BINARY_DIR}/sse4_test_build ${CMAKE_CURRENT_LIST_DIR}/test_for_sse4
sse4_test)
if(test_for_sse4_worked)
message (STATUS "SSE4 instructions can be executed by the host processor.")
set(SSE4_IS_AVAILABLE_ON_HOST 1)
endif()

View File

@ -9,8 +9,11 @@ endif()
# Check if we are being built as part of a pybind11 module.
if (COMMAND pybind11_add_module)
# For python users, assume they have SSE4 at least and then if the host machine has AVX use that too.
set(USE_SSE4_INSTRUCTIONS ON CACHE BOOL "Use SSE4 instructions")
# For python users, enable SSE4 and AVX if they have these instructions.
include(${CMAKE_CURRENT_LIST_DIR}/check_if_sse4_instructions_executable_on_host.cmake)
if (SSE4_IS_AVAILABLE_ON_HOST)
set(USE_SSE4_INSTRUCTIONS ON CACHE BOOL "Use SSE4 instructions")
endif()
include(${CMAKE_CURRENT_LIST_DIR}/check_if_avx_instructions_executable_on_host.cmake)
if (AVX_IS_AVAILABLE_ON_HOST)
set(USE_AVX_INSTRUCTIONS ON CACHE BOOL "Use AVX instructions")

View File

@ -0,0 +1,23 @@
cmake_minimum_required(VERSION 2.8.12)
project(sse4_test)
set(USE_SSE4_INSTRUCTIONS ON CACHE BOOL "Use SSE4 instructions")
# Pull this in since it sets the SSE4 compile options by putting that kind of stuff into the active_compile_opts list.
include(../set_compiler_specific_options.cmake)
try_run(run_result compile_result ${PROJECT_BINARY_DIR}/sse4_test_try_run_build ${CMAKE_CURRENT_LIST_DIR}/sse4_test.cpp
COMPILE_DEFINITIONS ${active_compile_opts})
message(STATUS "run_result = ${run_result}")
message(STATUS "compile_result = ${compile_result}")
if ("${run_result}" EQUAL 0 AND compile_result)
message(STATUS "Ran SSE4 test program successfully, you have SSE4 available.")
else()
message(STATUS "Unable to run SSE4 test program, you don't seem to have SSE4 instructions available.")
# make this build fail so that calling try_compile statements will error in this case.
add_library(make_this_build_fail ${CMAKE_CURRENT_LIST_DIR}/this_file_doesnt_compile.cpp)
endif()

View File

@ -0,0 +1,18 @@
#include <xmmintrin.h>
#include <emmintrin.h>
#include <mmintrin.h>
#include <pmmintrin.h> // SSE3
#include <tmmintrin.h>
#include <smmintrin.h> // SSE4
int main()
{
__m128 x;
x = _mm_set1_ps(1.23);
x = _mm_ceil_ps(x);
return 0;
}
// ------------------------------------------------------------------------------------

View File

@ -0,0 +1,3 @@
#error "This file doesn't compile!"