Skip to content

Commit

Permalink
Implement coarray parallelism
Browse files Browse the repository at this point in the history
  • Loading branch information
aradi committed Mar 10, 2024
1 parent af51a8e commit fd2c820
Show file tree
Hide file tree
Showing 39 changed files with 1,077 additions and 1,402 deletions.
112 changes: 60 additions & 52 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,113 +11,121 @@

cmake_minimum_required(VERSION 3.22...3.28)

list(APPEND CMAKE_MESSAGE_CONTEXT FortunoMpi)
list(APPEND CMAKE_MESSAGE_CONTEXT FortunoCoarray)
project(
FortunoMpi
FortunoCoarray
VERSION 0.1.0
DESCRIPTION "Extensible unit testing framework for Fortran (MPI dependent part)"
HOMEPAGE_URL "https://github.com/fortuno-repos/fortuno-mpi"
DESCRIPTION "Extensible unit testing framework for Fortran (coarray dependent part)"
HOMEPAGE_URL "https://github.com/fortuno-repos/fortuno-coarray"
LANGUAGES Fortran
)

#[=================================================================================================[
# Options #
]=================================================================================================]

option(FORTUNO_MPI_BUILD_SHARED_LIBS "Fortuno: Build as shared library" ${PROJECT_IS_TOP_LEVEL})
option(FORTUNO_COA_BUILD_SHARED_LIBS "Fortuno: Build as shared library" ${PROJECT_IS_TOP_LEVEL})

option(FORTUNO_MPI_BUILD_TESTS "Fortuno: Build test suite" ${PROJECT_IS_TOP_LEVEL})
option(FORTUNO_COA_BUILD_TESTS "Fortuno: Build test suite" ${PROJECT_IS_TOP_LEVEL})

option(FORTUNO_MPI_BUILD_EXAMPLES "Fortuno: Build example apps" ${PROJECT_IS_TOP_LEVEL})
option(FORTUNO_COA_BUILD_EXAMPLES "Fortuno: Build example apps" ${PROJECT_IS_TOP_LEVEL})

option(FORTUNO_MPI_INSTALL "Fortuno: Install project" ${PROJECT_IS_TOP_LEVEL})
option(FORTUNO_COA_INSTALL "Fortuno: Install project" ${PROJECT_IS_TOP_LEVEL})

set(
FORTUNO_MPI_INSTALL_MODULEDIR "modules" CACHE STRING
"Sub-directory to install the Fortran module files into (relative to CMAKE_INSTALL_LIBDIR)"
FORTUNO_COA_INSTALL_MODULEDIR "modules" CACHE STRING
"Fortuno: Sub-directory to install the Fortran module files into (relative to CMAKE_INSTALL_LIBDIR)"
)

set(
FORTUNO_MPI_SUBPROJECT_GET_METHODS "find;fetch" CACHE STRING
"Priority list of methods to obtain subprojects"
option(
FORTUNO_COA_SUBPROJECT_REQUIRE_FIND
"Fortuno: Whether all subprojects should be obtained by the find method (e.g. for packaging)"
FALSE
)

option(
FORTUNO_COA_SUBPROJECT_DISABLE_FIND
"Fortuno: Whether none of the subprojects should be obtained by the find method"
FALSE
)

set(FORTUNO_COA_COARRAY_COMPILER_FLAG "" CACHE STRING "Fortuno: Compiler flag to use for coarrays")

set(FORTUNO_COA_COARRAY_LINKER_FLAG "" CACHE STRING "Fortuno: Linker flag to use for coarrays")

#[=================================================================================================[
# Project configuration #
]=================================================================================================]

list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
include(FortunoMpiHelpers)
include(FortunoCoarrayHelpers)

if (FORTUNO_MPI_INSTALL)
if (FORTUNO_COA_INSTALL)
include(CMakePackageConfigHelpers)
include(GNUInstallDirs)
endif ()

fortuno_mpi_setup_build_type("RelWithDebInfo")
set(BUILD_SHARED_LIBS ${FORTUNO_MPI_BUILD_SHARED_LIBS})
fortuno_coa_setup_build_type("RelWithDebInfo")
set(BUILD_SHARED_LIBS ${FORTUNO_COA_BUILD_SHARED_LIBS})

find_package(MPI REQUIRED)
if(NOT MPI_FORTRAN_FOUND)
message(FATAL_ERROR "Failed to detect MPI-framework for Fortran")
endif()
fortuno_coa_def_coarray_target()

#[=================================================================================================[
# Main definition #
]=================================================================================================]

# Get Fortuno as subproject
include(FetchContent)
include(subprojects/fortuno.cmake)

add_subdirectory(src)
if (FORTUNO_MPI_BUILD_EXAMPLES)
add_subdirectory(src/fortuno)
if (FORTUNO_COA_BUILD_EXAMPLES)
add_subdirectory(example)
endif ()

#[=================================================================================================[
# Install or Export #
]=================================================================================================]

if (FORTUNO_MPI_INSTALL)
if (FORTUNO_COA_INSTALL)

# pkg-config files
configure_file(cmake/fortuno-mpi.pc.in fortuno-mpi.pc @ONLY)
configure_file(cmake/fortuno-coarray.pc.in fortuno-coarray.pc @ONLY)
install(
FILES ${CMAKE_CURRENT_BINARY_DIR}/fortuno-mpi.pc
FILES ${CMAKE_CURRENT_BINARY_DIR}/fortuno-coarray.pc
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
COMPONENT FortunoMpi_development
COMPONENT FortunoCoarray_development
)

# cmake export files
write_basic_package_version_file(
${CMAKE_CURRENT_BINARY_DIR}/FortunoMpiConfigVersion.cmake
${CMAKE_CURRENT_BINARY_DIR}/FortunoCoarrayConfigVersion.cmake
VERSION ${PROJECT_VERSION}
# COMPATIBILITY SameMajorVersion
COMPATIBILITY SameMinorVersion
)
configure_package_config_file(
cmake/FortunoMpiConfig.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/FortunoMpiConfig.cmake
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/FortunoMpi
cmake/FortunoCoarrayConfig.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/FortunoCoarrayConfig.cmake
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/FortunoCoarray
)
install(
FILES ${CMAKE_CURRENT_BINARY_DIR}/FortunoMpiConfigVersion.cmake
${CMAKE_CURRENT_BINARY_DIR}/FortunoMpiConfig.cmake
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/FortunoMpi
COMPONENT FortunoMpi_development
FILES ${CMAKE_CURRENT_BINARY_DIR}/FortunoCoarrayConfigVersion.cmake
${CMAKE_CURRENT_BINARY_DIR}/FortunoCoarrayConfig.cmake
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/FortunoCoarray
COMPONENT FortunoCoarray_development
)

export(
EXPORT FortunoMpiTargets
FILE FortunoMpiTargets.cmake
EXPORT FortunoCoarrayTargets
FILE FortunoCoarrayTargets.cmake
NAMESPACE Fortuno::
)
install(
EXPORT FortunoMpiTargets
FILE FortunoMpiTargets.cmake
EXPORT FortunoCoarrayTargets
FILE FortunoCoarrayTargets.cmake
NAMESPACE Fortuno::
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/FortunoMpi
COMPONENT FortunoMpi_development
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/FortunoCoarray
COMPONENT FortunoCoarray_development
)
endif ()

Expand All @@ -126,19 +134,19 @@ if (NOT PROJECT_IS_TOP_LEVEL)
# Propagate variables
if (CMAKE_VERSION VERSION_LESS 3.25)
# TODO: Remove when required minimum cmake version is >= 3.25
set(FortunoMpi_VERSION ${FortunoMpi_VERSION} PARENT_SCOPE)
set(FortunoMpi_VERSION_MAJOR ${FortunoMpi_VERSION_MAJOR} PARENT_SCOPE)
set(FortunoMpi_VERSION_MINOR ${FortunoMpi_VERSION_MINOR} PARENT_SCOPE)
set(FortunoMpi_VERSION_PATCH ${FortunoMpi_VERSION_PATCH} PARENT_SCOPE)
set(FortunoMpi_VERSION_TWEAK ${FortunoMpi_VERSION_TWEAK} PARENT_SCOPE)
set(FortunoCoarray_VERSION ${FortunoCoarray_VERSION} PARENT_SCOPE)
set(FortunoCoarray_VERSION_MAJOR ${FortunoCoarray_VERSION_MAJOR} PARENT_SCOPE)
set(FortunoCoarray_VERSION_MINOR ${FortunoCoarray_VERSION_MINOR} PARENT_SCOPE)
set(FortunoCoarray_VERSION_PATCH ${FortunoCoarray_VERSION_PATCH} PARENT_SCOPE)
set(FortunoCoarray_VERSION_TWEAK ${FortunoCoarray_VERSION_TWEAK} PARENT_SCOPE)
else ()
return(
PROPAGATE
FortunoMpi_VERSION
FortunoMpi_VERSION_MAJOR
FortunoMpi_VERSION_MINOR
FortunoMpi_VERSION_PATCH
FortunoMpi_VERSION_TWEAK
FortunoCoarray_VERSION
FortunoCoarray_VERSION_MAJOR
FortunoCoarray_VERSION_MINOR
FortunoCoarray_VERSION_PATCH
FortunoCoarray_VERSION_TWEAK
)
endif ()
endif ()
3 changes: 3 additions & 0 deletions cmake/FortunoCoarrayConfig.cmake.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
@PACKAGE_INIT@

include(${CMAKE_CURRENT_LIST_DIR}/FortunoCoarrayTargets.cmake)
50 changes: 50 additions & 0 deletions cmake/FortunoCoarrayHelpers.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# This file is part of Fortuno.
# Licensed under the BSD-2-Clause Plus Patent license.
# SPDX-License-Identifier: BSD-2-Clause-Patent

# Sets up the build type.
function (fortuno_coa_setup_build_type default_build_type)

get_property(_multiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
if(_multiConfig)
message(STATUS "Build type multi-config (build type selected at the build step)")
else()
if(NOT CMAKE_BUILD_TYPE)
message(STATUS "Build type ${default_build_type} (default single-config)")
set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE STRING "Build type" FORCE)
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY HELPSTRING "Choose the type of build")
set_property(
CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "RelWithDebInfo"
)
else()
message(STATUS "Build type: ${CMAKE_BUILD_TYPE} (manually selected single-config)")
endif()
endif()

endfunction ()


# Defines the coarray target for coarray dependent parts
function (fortuno_coa_def_coarray_target)

if (FORTUNO_COA_COARRAY_COMPILER_FLAG)
set(_compiler_flag "${FORTUNO_COA_COARRAY_COMPILER_FLAG}")
elseif (CMAKE_Fortran_COMPILER_ID STREQUAL "IntelLLVM")
set(_compiler_flag "-coarray")
elseif (CMAKE_Fortran_COMPILER_ID STREQUAL "NAG")
set(_compiler_flag "")
endif ()

if (FORTUNO_COA_COARRAY_LINKER_FLAG)
set(_linker_flag "${FORTUNO_COA_COARRAY_LINKER_FLAG}")
elseif (CMAKE_Fortran_COMPILER_ID STREQUAL "IntelLLVM")
set(_linker_flag "-coarray")
elseif (CMAKE_Fortran_COMPILER_ID STREQUAL "NAG")
set(_linker_flag "")
endif ()

add_library(Coarray INTERFACE)
target_compile_options(Coarray INTERFACE ${_compiler_flag})
target_link_options(Coarray INTERFACE ${_linker_flag})

endfunction ()
3 changes: 0 additions & 3 deletions cmake/FortunoMpiConfig.cmake.in

This file was deleted.

130 changes: 0 additions & 130 deletions cmake/FortunoMpiHelpers.cmake

This file was deleted.

7 changes: 7 additions & 0 deletions cmake/fortuno-coarray.pc.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
Name: @PROJECT_NAME@
Description: @PROJECT_DESCRIPTION@
Version: @PROJECT_VERSION@

Requires: fortuno
Cflags: -I@CMAKE_INSTALL_FULL_LIBDIR@/@FORTUNO_COA_INSTALL_MODULEDIR@
Libs: -L@CMAKE_INSTALL_FULL_LIBDIR@ -lfortuno-coarray
Loading

0 comments on commit fd2c820

Please sign in to comment.