Merge branch 'release-4-5-patches'
[gromacs/adressmacs.git] / cmake / ThreadMPI.cmake
blob853372741c14e6128fd8b40ae3685c352b190b9c
2 include(CheckIncludeFiles)
3 include(CheckFunctionExists)
4 #include(CheckCSourceCompiles)
6 #option(THREAD_PTHREADS "Use posix threads" ON)
8 MACRO(TEST_TMPI_ATOMICS VARIABLE)
9     if (NOT DEFINED TMPI_ATOMICS)
10         try_compile(TEST_ATOMICS "${CMAKE_BINARY_DIR}"
11                 "${CMAKE_SOURCE_DIR}/cmake/TestAtomics.c"
12                 COMPILE_DEFINITIONS "-I${CMAKE_SOURCE_DIR}/include" )
14         if (TEST_ATOMICS)
15             message(STATUS "Atomics found")
16             set(${VARIABLE} CACHE INTERNAL 1)
17         else (TEST_ATOMICS)
18             message(WARNING "Atomics not found for this compiler+cpu combination. Thread support will be unbearably slow: disable threads. Atomics should work on all but the most obscure CPU+compiler combinations; if your system is not obscure -- like, for example, x86 with gcc --  please contact the developers.")
19             set(${VARIABLE} CACHE INTERNAL 0)
20         endif(TEST_ATOMICS)
21     endif(NOT DEFINED TMPI_ATOMICS)
22 ENDMACRO(TEST_TMPI_ATOMICS VARIABLE)
25 include(FindThreads)
26 if (CMAKE_USE_PTHREADS_INIT)
27     check_include_files(pthread.h    HAVE_PTHREAD_H)
28     set(THREAD_PTHREADS 1)
29     #add_definitions(-DTHREAD_PTHREADS)
30     set(THREAD_MPI_SRC 
31         thread_mpi/alltoall.c      thread_mpi/p2p_protocol.c
32         thread_mpi/barrier.c       thread_mpi/p2p_send_recv.c
33         thread_mpi/bcast.c         thread_mpi/p2p_wait.c
34         thread_mpi/collective.c    thread_mpi/profile.c
35         thread_mpi/comm.c          thread_mpi/pthreads.c
36         thread_mpi/errhandler.c    thread_mpi/reduce.c
37         thread_mpi/event.c         thread_mpi/reduce_fast.c
38         thread_mpi/gather.c        thread_mpi/scatter.c
39         thread_mpi/group.c         thread_mpi/tmpi_init.c
40         thread_mpi/hwinfo.c        thread_mpi/topology.c
41         thread_mpi/list.c          thread_mpi/type.c
42         thread_mpi/lock.c          
43         thread_mpi/once.c)
44     set(THREAD_LIB ${CMAKE_THREAD_LIBS_INIT})
45 else (CMAKE_USE_PTHREADS_INIT)
46     if (CMAKE_USE_WIN32_THREADS_INIT)
47         set(THREAD_WINDOWS 1)
48         #add_definitions(-DTHREAD_WINDOWS)
49         set(THREAD_MPI_SRC 
50             thread_mpi/alltoall.c      thread_mpi/p2p_protocol.c
51             thread_mpi/barrier.c       thread_mpi/p2p_send_recv.c
52             thread_mpi/bcast.c         thread_mpi/p2p_wait.c
53             thread_mpi/collective.c    thread_mpi/profile.c
54             thread_mpi/comm.c          
55             thread_mpi/errhandler.c    thread_mpi/reduce.c
56             thread_mpi/event.c         thread_mpi/reduce_fast.c
57             thread_mpi/gather.c        thread_mpi/scatter.c
58             thread_mpi/group.c         thread_mpi/tmpi_init.c
59             thread_mpi/hwinfo.c        thread_mpi/topology.c
60             thread_mpi/list.c          thread_mpi/type.c
61             thread_mpi/lock.c          thread_mpi/winthreads.c
62             thread_mpi/once.c)
63         set(THREAD_LIBRARY )
64     endif (CMAKE_USE_WIN32_THREADS_INIT)
65 endif (CMAKE_USE_PTHREADS_INIT)
67 # the spin-waiting option
68 option(THREAD_MPI_WAIT_FOR_NO_ONE "Use busy waits without yielding to the OS scheduler. Turning this on might improve performance (very) slightly at the cost of very poor performance if the threads are competing for CPU time." OFF)
69 mark_as_advanced(THREAD_MPI_WAIT_FOR_NO_ONE)
70 if (THREAD_MPI_WAIT_FOR_NO_ONE)
71     add_definitions(-DTMPI_WAIT_FOR_NO_ONE)
72 else (THREAD_MPI_WAIT_FOR_NO_ONE)
73     add_definitions()
74 endif (THREAD_MPI_WAIT_FOR_NO_ONE)
77 # the copy buffer option
78 option(THREAD_MPI_COPY_BUFFER "Use an intermediate copy buffer for small message sizes, to allow blocking sends to return quickly." ON)
79 mark_as_advanced(THREAD_MPI_COPY_BUFFER)
80 if (THREAD_MPI_COPY_BUFFER)
81     add_definitions()
82 else (THREAD_MPI_COPY_BUFFER)
83     add_definitions(-DTMPI_NO_COPY_BUFFER)
84 endif (THREAD_MPI_COPY_BUFFER)
87 # the profiling option
88 option(THREAD_MPI_PROFILING "Turn on simple MPI profiling." OFF)
89 mark_as_advanced(THREAD_MPI_PROFILING)
90 if (THREAD_MPI_PROFILING)
91     add_definitions(-DTMPI_PROFILE)
92 else (THREAD_MPI_PROFILING)
93     add_definitions()
94 endif (THREAD_MPI_PROFILING)
97 # this runs on POSIX systems
98 check_include_files(unistd.h        HAVE_UNISTD_H)
99 check_include_files(sched.h         HAVE_SCHED_H)
100 check_include_files(sys/time.h      HAVE_SYS_TIME_H)
101 check_function_exists(sysconf       HAVE_SYSCONF)
102 # this runs on windows
103 #check_include_files(windows.h          HAVE_WINDOWS_H)
104 #check_function_exists(GetSystemInfo HAVE_SYSTEM_INFO)
106 test_tmpi_atomics(TMPI_ATOMICS)