diff options
author | CNugteren <web@cedricnugteren.nl> | 2015-05-30 12:30:43 +0200 |
---|---|---|
committer | CNugteren <web@cedricnugteren.nl> | 2015-05-30 12:30:43 +0200 |
commit | bc5a341dfe591946e925db315fc7d8c0c25c2938 (patch) | |
tree | b216ab5eee4863e3807d92b5ddd19fa22197ed22 /CMakeLists.txt | |
parent | c7b054ea6747039f4405fd93da6e924f3e5c7f4b (diff) |
Initial commit of preview version
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r-- | CMakeLists.txt | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..6cdb3e46 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,205 @@ + +# ================================================================================================== +# This file is part of the CLBlast project. The project is licensed under Apache Version 2.0. This +# project loosely follows the Google C++ styleguide and uses a tab-size of two spaces and a max- +# width of 100 characters per line. +# +# Author(s): +# Cedric Nugteren <www.cedricnugteren.nl> +# +# ================================================================================================== + +# CMake project details +cmake_minimum_required(VERSION 2.8.10) +project("clblast" CXX) +set(clblast_VERSION_MAJOR 0) +set(clblast_VERSION_MINOR 1) +set(clblast_VERSION_PATCH 0) + +# Options and their default values +option(SAMPLES "Enable compilation of the examples" OFF) +option(TUNERS "Enable compilation of the tuners" OFF) +option(TESTS "Enable compilation of the performance and correctness tests" OFF) + +# ================================================================================================== + +# RPATH settings +set(CMAKE_SKIP_BUILD_RPATH false) # Use, i.e. don't skip the full RPATH for the build tree +set(CMAKE_BUILD_WITH_INSTALL_RPATH false) # When building, don't use the install RPATH already +set(CMAKE_INSTALL_RPATH "") # The RPATH to be used when installing +set(CMAKE_INSTALL_RPATH_USE_LINK_PATH false) # Don't add the automatically determined parts + +# ================================================================================================== + +# Compiler-version check (requires at least CMake 2.8.10) +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") + if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.7) + message(FATAL_ERROR "GCC version must be at least 4.7") + endif() +elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.3) + message(FATAL_ERROR "Clang version must be at least 3.3") + endif() +elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang") + if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0) + message(FATAL_ERROR "AppleClang version must be at least 5.0") + endif() +elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel") + if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 14.0) + message(FATAL_ERROR "ICC version must be at least 14.0") + endif() +elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 18.0) + message(FATAL_ERROR "MS Visual Studio version must be at least 18.0") + endif() +endif() + +# C++ compiler settings +set(FLAGS "-O3 -std=c++11") +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") + set(FLAGS "${FLAGS} -Wall -Wno-comment -Wno-return-type -Wno-switch -Wno-missing-noreturn") + if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9.0) + set(FLAGS "${FLAGS} -Wno-attributes -Wno-unused-variable") + endif() +elseif ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") + set(FLAGS "${FLAGS} -Weverything -Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno-padded") + set(FLAGS "${FLAGS} -Wno-missing-prototypes -Wno-float-equal -Wno-switch-enum -Wno-switch") + set(FLAGS "${FLAGS} -Wno-exit-time-destructors -Wno-global-constructors -Wno-missing-noreturn") +endif() +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAGS}") + +# ================================================================================================== + +# Package scripts location +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") + +# Requires OpenCL. It is found through the included "FindOpenCL.cmake" in CMAKE_MODULE_PATH. +find_package(OpenCL REQUIRED) + +# Locates the CLTune library in case the tuners need to be compiled. "FindCLTune.cmake" is included. +if(TUNERS) + find_package(CLTune) + if(NOT CLTUNE_FOUND) + message(STATUS "Could NOT find CLTune, disabling the compilation of the tuners") + set(TUNERS OFF) + endif() +endif() + +# ================================================================================================== + +# Includes directories: CLBlast and OpenCL +include_directories(${clblast_SOURCE_DIR}/include ${OPENCL_INCLUDE_DIRS}) + +# ================================================================================================== + +# Sets the supported routines and the used kernels. New routines and kernels should be added here. +set(KERNELS copy pad transpose padtranspose xaxpy xgemm) +set(SAMPLE_PROGRAMS sgemm) +set(ROUTINES_XY xaxpy) +set(ROUTINES_ABC xgemm xsymm) +set(ROUTINES ${ROUTINES_XY} ${ROUTINES_ABC}) + +# ================================================================================================== + +# Gathers all source-files +set(SOURCES src/clblast.cc src/database.cc src/routine.cc src/utilities.cc) +foreach(ROUTINE ${ROUTINES}) + set(SOURCES ${SOURCES} src/routines/${ROUTINE}.cc) +endforeach() + +# Creates and links the library +add_library(clblast SHARED ${SOURCES}) +target_link_libraries(clblast ${OPENCL_LIBRARIES}) + +# Installs the library +install(TARGETS clblast DESTINATION lib) +install(FILES include/clblast.h DESTINATION include) + +# ================================================================================================== + +# This section contains all the code related to the examples +if(SAMPLES) + + # Adds sample programs + foreach(SAMPLE ${SAMPLE_PROGRAMS}) + add_executable(sample_${SAMPLE} samples/${SAMPLE}.cc) + target_link_libraries(sample_${SAMPLE} clblast ${OPENCL_LIBRARIES}) + install(TARGETS sample_${SAMPLE} DESTINATION bin) + endforeach() + +endif() + +# ================================================================================================== + +# This section contains all the code related to the tuners. These tuners require the presence of +# the CLTune library (not included as part of the source). +if(TUNERS) + + # Includes CLTune + include_directories(${CLTUNE_INCLUDE_DIRS}) + + # Creates the common tuner objects (requires CMake 2.8.8) + add_library(tuners_common OBJECT src/tuning/tuning.cc) + + # Adds tuning executables + foreach(KERNEL ${KERNELS}) + add_executable(tuner_${KERNEL} $<TARGET_OBJECTS:tuners_common> src/tuning/${KERNEL}.cc) + target_link_libraries(tuner_${KERNEL} clblast ${CLTUNE_LIBRARIES} ${OPENCL_LIBRARIES}) + install(TARGETS tuner_${KERNEL} DESTINATION bin) + endforeach() + +endif() + +# ================================================================================================== + +# Down from here is all test (performance and correctness) related. Note that these tests require +# the compilation of the clBLAS library to act as a reference. +if(TESTS) + + # Enables clBLAS to provide as reference for the tests (source-code is shipped with the project). + # This subproject uses specific flags to reduce the amount of warnings. + set(CMAKE_CXX_FLAGS_CLBLAST ${CMAKE_CXX_FLAGS}) + set(CMAKE_CXX_FLAGS "-O3") + add_subdirectory(external/clBLAS/src) + set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS_CLBLAST}) + + # Adds new include directories for the reference clBLAS + include_directories(${clblast_SOURCE_DIR}/test ${clBLAS_SOURCE_DIR}) + + # Creates the common correctness-tests objects (requires CMake 2.8.8) + add_library(test_correctness_common OBJECT test/correctness/tester.cc) + add_library(test_correctness_xy OBJECT test/correctness/testxy.cc) + add_library(test_correctness_abc OBJECT test/correctness/testabc.cc) + + # Compiles the correctness-tests + foreach(ROUTINE ${ROUTINES_XY}) + add_executable(test_${ROUTINE} + $<TARGET_OBJECTS:test_correctness_common> + $<TARGET_OBJECTS:test_correctness_xy> + test/correctness/routines/${ROUTINE}.cc) + target_link_libraries(test_${ROUTINE} clBLAS clblast ${OPENCL_LIBRARIES}) + install(TARGETS test_${ROUTINE} DESTINATION bin) + endforeach() + foreach(ROUTINE ${ROUTINES_ABC}) + add_executable(test_${ROUTINE} + $<TARGET_OBJECTS:test_correctness_common> + $<TARGET_OBJECTS:test_correctness_abc> + test/correctness/routines/${ROUTINE}.cc) + target_link_libraries(test_${ROUTINE} clBLAS clblast ${OPENCL_LIBRARIES}) + install(TARGETS test_${ROUTINE} DESTINATION bin) + endforeach() + + # Creates the common performance-tests objects (requires CMake 2.8.8) + add_library(test_performance_common OBJECT test/performance/client.cc) + + # Compiles the performance-tests + set(TEST_PERF_COMM ) + foreach(ROUTINE ${ROUTINES}) + add_executable(client_${ROUTINE} $<TARGET_OBJECTS:test_performance_common> + test/performance/routines/${ROUTINE}.cc) + target_link_libraries(client_${ROUTINE} clBLAS clblast ${OPENCL_LIBRARIES}) + install(TARGETS client_${ROUTINE} DESTINATION bin) + endforeach() + +endif() +# ================================================================================================== |