CMakeLists.txt 4.7 KB
Newer Older
1
2
cmake_minimum_required(VERSION 2.6)
project(BioEM)
qon's avatar
qon committed
3

4
5
6
7
8
9
###Set up options
option (INCLUDE_CUDA "Build BioEM with CUDA support" ON)
option (INCLUDE_OPENMP "Build BioEM with OpenMP support" ON)
option (INCLUDE_MPI "Build BioEM with MPI support" ON)
option (PRINT_CMAKE_VARIABLES "List all CMAKE Variables" OFF)
option (CUDA_FORCE_GCC "Force GCC as host compiler for CUDA part (If standard host compiler is incompatible with CUDA)" OFF)
qon's avatar
qon committed
10

11
12
13
###Set up general variables
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}")
qon's avatar
qon committed
14

15
include_directories(include)
qon's avatar
qon committed
16

17
18
set (BIOEM_ICC_FLAGS "-xHost -O3 -fno-alias -fno-fnalias -unroll -g0 -ipo")
set (BIOEM_GCC_FLAGS "-O3 -march=native -fweb -mfpmath=sse -frename-registers -minline-all-stringops -ftracer -funroll-loops -fpeel-loops -fprefetch-loop-arrays -ffast-math -ggdb")
qon's avatar
qon committed
19

20
21
22
23
24
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${BIOEM_ICC_FLAGS}")
else()
	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${BIOEM_GCC_FLAGS}")
endif()
25

26
set (BIOEM_SOURCE_FILES "bioem.cpp" "main.cpp" "map.cpp" "model.cpp" "param.cpp" "cmodules/timer.cpp")
27

28
###Find Required Packages
Pilar Cossio's avatar
Pilar Cossio committed
29
30
31
32
33
34
35
find_package(PkgConfig)
if (PKG_CONFIG_FOUND)
    pkg_check_modules(FFTW fftw3)
endif()
if (NOT FFTW_FOUND)
    find_package(FFTW 3 REQUIRED)
endif()
36
include_directories(${FFTW_INCLUDE_DIRS})
37

38
39
find_package(Boost 1.43 REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})
40

41
###Find Optional Packages
42

43
44
45
46
47
48
###Find CUDA
set (BIOEM_CUDA_STATUS "Disabled")
if (INCLUDE_CUDA)
	set (BIOEM_CUDA_STATUS "Not Found")
	find_package(CUDA)
endif()
49

50
51
52
53
54
55
56
if (CUDA_FOUND)
	if (CUDA_FORCE_GCC)
		cmake_minimum_required(VERSION 2.8.10.1)
		#Use GCC as host compiler for CUDA even though host compiler for other files is not GCC
		set (CUDA_HOST_COMPILER gcc)
	endif()
	set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS};--use_fast_math;-ftz=true;-O4;-Xptxas -O4")
57

58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
	list(APPEND CUDA_NVCC_FLAGS "-gencode=arch=compute_13,code=sm_13")
	list(APPEND CUDA_NVCC_FLAGS "-gencode=arch=compute_20,code=sm_20")
	list(APPEND CUDA_NVCC_FLAGS "-gencode=arch=compute_20,code=sm_21")
	list(APPEND CUDA_NVCC_FLAGS "-gencode=arch=compute_30,code=sm_30")
	list(APPEND CUDA_NVCC_FLAGS "-gencode=arch=compute_35,code=sm_35")

	add_definitions(-DWITH_CUDA)
	set (BIOEM_CUDA_STATUS "Found")
endif()

###Find OpenMP
set (BIOEM_OPENMP_STATUS "Disabled")
if (INCLUDE_OPENMP)
	set (BIOEM_OPENMP_STATUS "Not Found")
	find_package(OpenMP)
endif()

if(OPENMP_FOUND)
	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
	add_definitions(-DWITH_OPENMP)
	set (BIOEM_OPENMP_STATUS "Found")
endif()

###Find MPI
set (BIOEM_MPI_STATUS "Disabled")
if (INCLUDE_MPI)
	set (BIOEM_MPI_STATUS "Not Found")
	find_package(MPI)
endif()

if (MPI_FOUND)
	include_directories(${MPI_INCLUDE_PATH})
	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MPI_COMPILE_FLAGS} ${MPI_LINK_FLAGS}")
	add_definitions(-DWITH_MPI)
	set (BIOEM_MPI_STATUS "Found")
endif()

###Build Executable
if (CUDA_FOUND)
	set(BIOEM_TMP_CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
	if (CUDA_FORCE_GCC)
		#Hack to use GCC flags for GCC host compiler during NVCC compilation, although host compiler is in fact not GCC for other files
		set(CMAKE_CXX_FLAGS ${BIOEM_GCC_FLAGS})
	endif()
	cuda_add_executable(bioEM ${BIOEM_SOURCE_FILES} bioem_cuda.cu)
	set(CMAKE_CXX_FLAGS ${BIOEM_TMP_CMAKE_CXX_FLAGS})
else()
	add_executable(bioEM ${BIOEM_SOURCE_FILES})
endif()

#Additional CXX Flags not used by CUDA compiler
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
Pilar Cossio's avatar
Pilar Cossio committed
110
	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -pedantic")
111
else()
Pilar Cossio's avatar
Pilar Cossio committed
112
	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Wno-vla -Wno-unused-result -Wno-unused-local-typedefs -pedantic")
113
114
115
116
117
118
119
120
endif()
if (NOT OPENMP_FOUND)
	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unknown-pragmas")
endif()

###Add Libraries
if (CUDA_FOUND)
	cuda_add_cufft_to_target(bioEM)
David Rohr's avatar
David Rohr committed
121
	target_link_libraries(bioEM ${CUDA_CUDA_LIBRARY})
122
123
endif()

David Rohr's avatar
David Rohr committed
124
125
126
127
128
if (FFTWF_LIBRARIES)
	target_link_libraries(bioEM ${FFTWF_LIBRARIES})
else()
	target_link_libraries(bioEM -L${FFTW_LIBDIR} -lfftw3 -lfftw3f)
endif()
129
130
131
132
133
134
135
136
target_link_libraries(bioEM -L${Boost_LIBRARY_DIRS} -lboost_program_options)

if (MPI_FOUND)
	target_link_libraries(bioEM ${MPI_LIBRARIES})
endif()

###Show Status
message(STATUS "Build Status")
137
138
139
message(STATUS "FFTW library: ${FFTW_LIBDIR}")
message(STATUS "Boost directory: ${Boost_LIBRARY_DIRS}")
message(STATUS "FFTW includedir: ${FFTW_INCLUDEDIR}")
140
141
142
143
144
145
146
147
148
149
message(STATUS "CUDA: ${BIOEM_CUDA_STATUS}")
message(STATUS "OpenMP: ${BIOEM_OPENMP_STATUS}")
message(STATUS "MPI: ${BIOEM_MPI_STATUS}")

if (PRINT_CMAKE_VARIABLES)
	get_cmake_property(_variableNames VARIABLES)
	foreach (_variableName ${_variableNames})
		message(STATUS "${_variableName}=${${_variableName}}")
	endforeach()
endif()
150