使用Cmake与MPI和MPE

时间:2016-09-27 16:04:43

标签: cmake mpi

我有以下工作CMakeList.txt作为更大项目的一部分:

# Project details
# ---------------
project(DAMZernike2016_mpi)

enable_language (C Fortran)

SET(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../../utils/" ${CMAKE_MODULE_PATH})

find_package(MPI REQUIRED)   # This is redundant (it has been previously checked), but convenient not to forget that MPI is necessary
add_definitions(${MPI_Fortran_COMPILE_FLAGS})
include_directories(${MPI_Fortran_INCLUDE_PATH})
link_directories(${MPI_Fortran_LIBRARIES})

# Fortran compiler flags
# ======================
set (CMAKE_Fortran_FLAGS_RELEASE "-O3")
set (CMAKE_Fortran_FLAGS_DEBUG "-O0 -g")

# Defines auxiliary containers with program names and directory with ancillary files
# ==================================================================================
set (DAMZernike_2016_mpi_PROGRAMS "DAMZernike-Jacobi_STO_mpi" "DAMZernike-Jacobi_GTO_mpi" )

set (DAMZernike_2016_mpi_EXECUTABLES "" )

set (ancillarydir "../DAMZernike2016" )

# Prepares Zernike-Jacobi_ckplm.F90 to be compiled without optimization (-O0)
# =============================================================================

set (ckplm_file "${ancillarydir}/Zernike-Jacobi_ckplm.F90")

SET_SOURCE_FILES_PROPERTIES(${ckplm_file} PROPERTIES COMPILE_FLAGS -O0) # Zernike-Jacobi_ckplm.F90 compiled without optimization to prevent long delay in compilation

# Ancillary files for libraries
# ===========================================================================

set (ancillaryfiles "${ancillarydir}/DAMZernike_2016_GLOBAL.F90" "${ancillarydir}/Zernike-Jacobi_ckplm.F90"  "${ancillarydir}/Zernike-Jacobi_paribkb.F90"  
"${ancillarydir}/Zernike-Jacobi_quadrat.f"  "${ancillarydir}/Zernike-Jacobi_stngexp.f"  
"${ancillarydir}/Zernike-Jacobi_subVABC.F90")

# Creates a library with modules
# ==============================
add_library(DAMZernikeGLOBAL_mpi_mods DAMZernike_2016_mpi_GLOBAL.F90 ${ancillaryfiles})

# Create binaries
# ===============
foreach (p ${DAMZernike_2016_mpi_PROGRAMS})
   add_executable(${p}.exe "${p}.F90")
   list (APPEND DAMZernike_2016_mpi_EXECUTABLES ${p}.exe )
endforeach (p)

# Links binaries to modules
# =========================
foreach (p ${DAMZernike_2016_mpi_EXECUTABLES})
   target_link_libraries("${p}" DAMZernikeGLOBAL_mpi_mods ${MPI_Fortran_LIBRARIES})
   message("Adds ${p}")
endforeach (p)

# install executables and scripts
# ===============================
install (TARGETS ${DAMZernike_2016_mpi_EXECUTABLES} RUNTIME DESTINATION ".")      # Default installation directory: /usr/local/bin/

我想修改它以将目标与MPE(确切地说,与MPEFC)链接,即将等效的内容与以下内容相关联:

CC = /usr/local/bin/mpicc
LD = /usr/local/bin/mpefc
OBJ = ring.o
SRC = ring.c
EXEC = ring
CFLAGS = -g
LDFLAGS = -lm -mpilog

all: $(EXEC)

$(EXEC): ${OBJ}
    $(LD) $(LDFLAGS) $< -o $(EXEC)

ring.o: ${SRC}
    $(CC) $(CFLAGS) -c ring.c

clean:
    $(RM) ${OBJ} $(EXEC)
    $(RM) *.clog2 *.slog2

我还从其他地方(https://github.com/losalamos/CLAMR/blob/master/cmake/Modules/FindMPE.cmake)选择了一个FindMPE.cmake来查找是否安装了MPE。它在我的系统中工作并返回几个变量,如:

MPE_LOG_INCLUDE_PATH = /usr/local/include
MPE_LOG_LIBRARIES = /usr/lib64/libmpe_f2cmpi.a;/usr/lib64/liblmpe.a;/usr/local/lib/libmpe.a
MPE_COMPILER = /usr/local/bin/mpefc

等。

我做了很多无用的尝试,但在网上找不到合适的信息。

任何提示?

2 个答案:

答案 0 :(得分:0)

我感觉到你的痛苦。不幸的是,cmake并不是特别擅长使用编译器/链接器包装器。通常,您必须使用查找脚本的相应..._LIBRARIES..._COMPILE_FLAGS..._LINK_FLAGS输出。在你的情况下,这可能看起来像:

find_package(MPI REQUIRED)
find_package(MPE REQUIRED)

# Links binaries to modules
# =========================
foreach (p ${DAMZernike_2016_mpi_EXECUTABLES})
   target_link_libraries("${p}" DAMZernikeGLOBAL_mpi_mods ${MPE_LOG_LIBRARIES} ${MPI_Fortran_LIBRARIES})
   set_target_properties("${p}" PROPERTIES COMPILE_FLAGS "${MPI_Fortran_COMPILE_FLAGS} ${MPE_COMPILE_FLAGS}")
   set_target_properties("${p}" PROPERTIES LINK_FLAGS "${MPI_Fortran_LINK_FLAGS} ${MPE_LINK_FLAGS}"
   message("Adds ${p}")
endforeach (p)

不幸的是我无法测试答案。我建议测试...FLAGS变量是否存在。

答案 1 :(得分:0)

根据Zulan的提示,并引入一个CACHE变量USE_MPE来控制是否需要MPE,以下代码可以完成这项工作:

# Links binaries to modules
# =========================
if(${USE_MPE})
    find_package(MPE)
    if (MPE_FOUND)
        message("Uses MPE for clog2 generation")
        set (MPI_Fortran_COMPILE_FLAGS "-lfmpich -llmpe -lmpe -lpmpich" ${MPI_Fortran_COMPILE_FLAGS})
    endif (MPE_FOUND)
endif(${USE_MPE})
foreach (p ${DAMZernike_2016_mpi_EXECUTABLES})
    target_link_libraries("${p}" DAMZernikeGLOBAL_mpi_mods ${MPE_LOG_LIBRARIES} ${MPI_Fortran_LIBRARIES})
    set_target_properties("${p}" PROPERTIES COMPILE_FLAGS "${MPI_Fortran_COMPILE_FLAGS} ${MPE_COMPILE_FLAGS}")
    set_target_properties("${p}" PROPERTIES LINK_FLAGS "${MPI_Fortran_LINK_FLAGS} ${MPE_LINK_FLAGS}")
    message("Adds ${p}")
endforeach (p)