Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Changes necessary to integrate AMS into a large multiphysics code #73

Open
wants to merge 9 commits into
base: develop
Choose a base branch
from
167 changes: 150 additions & 17 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ endif()
set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake;${CMAKE_MODULE_PATH};")

set(AMS_APP_LIBRARIES "")
set(AMS_APP_PRIVATE_LIBRARIES "")
set(AMS_APP_DEFINES "")
set(AMS_APP_INCLUDES "")

Expand All @@ -39,13 +40,16 @@ option(WITH_TORCH_DEBUG "Compute RMSE of Surrogate Model and Physics Module"
option(WITH_TESTS "Compile tests" OFF)
option(WITH_REDIS "Use REDIS as a database back end" OFF)
option(WITH_HDF5 "Use HDF5 as a database back end" OFF)
option(HDF5_USE_STATIC_LIBRARIES "Use static HDF5." OFF)
set(HDF5_WITH_ZLIB "" CACHE FILETYPE "Use the following zlib for HDF5")
option(WITH_RMQ "Use RabbitMQ as a database back end (require a reachable and running RabbitMQ server service)" OFF)
option(WITH_AMS_DEBUG "Enable verbose messages" OFF)
option(WITH_PERFFLOWASPECT "Use PerfFlowAspect for Profiling" OFF)
option(WITH_WORKFLOW "Install python drivers used by the outer workflow" OFF)
option(WITH_AMS_LIB "Install C++ library to support scientific applications" ON)
option(WITH_ADIAK "Use Adiak for recording metadata" OFF)
option(BUILD_SHARED_LIBS "Build using shared libraries" ON)
option(EXCLUDE_STATIC_LIBS "Exclude static libs from the linking line" OFF)

if (WITH_MPI)
# SET(CMAKE_CXX_COMPILER "${MPI_CXX_COMPILER}" CACHE FILEPATH "CXX compiler overridden with MPI C++ wrapper")
Expand All @@ -56,7 +60,6 @@ if (WITH_MPI)
message(STATUS "MPICXX: ${MPI_CXX_COMPILER}")
list(APPEND AMS_APP_LIBRARIES MPI::MPI_CXX)
message(STATUS "MPI Library used: " MPI::MPI_CXX)
list(APPEND AMS_APP_DEFINES "-D__ENABLE_MPI__")
endif()

# ------------------------------------------------------------------------------
Expand All @@ -69,6 +72,7 @@ if (WITH_CUDA)
if (BUILD_SHARED_LIBS)
set(CUDA_RUNTIME_LIBRARY "Shared")
else()
set(HDF5_USE_STATIC_LIBRARIES ON)
set(CUDA_RUNTIME_LIBRARY "Static")
endif()

Expand Down Expand Up @@ -132,14 +136,17 @@ endif() # WITH_REDIS

if (WITH_HDF5)
if (HDF5_USE_STATIC_LIBRARIES)
find_package(HDF5 NAMES hdf5 COMPONENTS C static NO_DEFAULT_PATH PATHS ${AMS_HDF5_DIR} ${AMS_HDF5_DIR}/share/cmake)
list(APPEND AMS_APP_LIBRARIES ${HDF5_C_STATIC_LIBRARY})
message(STATUS "HDF5 Static Library : ${HDF5_C_STATIC_LIBRARY}")
else()
find_package(HDF5 NAMES hdf5 COMPONENTS C shared NO_DEFAULT_PATH PATHS ${AMS_HDF5_DIR} ${AMS_HDF5_DIR}/share/cmake)
list(APPEND AMS_APP_LIBRARIES ${HDF5_C_SHARED_LIBRARY})
message(STATUS "HDF5 Shared Library : ${HDF5_C_SHARED_LIBRARY}")
endif()
find_package(HDF5 NAMES hdf5 COMPONENTS C static NO_DEFAULT_PATH PATHS ${AMS_HDF5_DIR} ${AMS_HDF5_DIR}/share/cmake)
list(APPEND AMS_APP_LIBRARIES ${HDF5_C_STATIC_LIBRARY})
message(STATUS "HDF5 Static Library : ${HDF5_C_STATIC_LIBRARY}")
else()
find_package(HDF5 NAMES hdf5 COMPONENTS C shared NO_DEFAULT_PATH PATHS ${AMS_HDF5_DIR} ${AMS_HDF5_DIR}/share/cmake)
list(APPEND AMS_APP_LIBRARIES ${HDF5_C_SHARED_LIBRARY})
message(STATUS "HDF5 Shared Library : ${HDF5_C_SHARED_LIBRARY}")
endif()
if (NOT HDF5_WITH_ZLIB STREQUAL "")
list(APPEND AMS_APP_LIBRARIES ${HDF5_WITH_ZLIB})
endif()
list(APPEND AMS_APP_INCLUDES ${HDF5_INCLUDE_DIR})
list(APPEND AMS_APP_DEFINES "-D__ENABLE_HDF5__")
message(STATUS "HDF5 Include directories: ${HDF5_INCLUDE_DIR}")
Expand Down Expand Up @@ -184,7 +191,7 @@ list(APPEND AMS_APP_LIBRARIES umpire)
list(APPEND AMS_APP_INCLUDES ${UMPIRE_INCLUDE_DIR})

find_package(nlohmann_json REQUIRED)
list(APPEND AMS_APP_LIBRARIES nlohmann_json::nlohmann_json)
list(APPEND AMS_APP_PRIVATE_LIBRARIES nlohmann_json::nlohmann_json)

# ------------------------------------------------------------------------------
find_package(Threads REQUIRED)
Expand All @@ -194,16 +201,50 @@ if (WITH_TORCH)
find_package(Torch REQUIRED)
# This is annoying, torch populates all my cuda flags
# and resets them
set(CMAKE_CUDA_FLAGS "")
# set(CMAKE_CUDA_FLAGS "")
set(CMAKE_CUDA_ARCHITECTURES ON)

list(APPEND AMS_APP_INCLUDES "${TORCH_INCLUDE_DIRS}")
list(APPEND AMS_APP_LIBRARIES "${TORCH_LIBRARIES}")

#get_target_property(torch_interface_system_includes
# torch INTERFACE_SYSTEM_INCLUDE_DIRECTORIES)
#if ( torch_interface_system_includes )
# list(APPEND AMS_APP_INCLUDES ${torch_interface_system_includes})
#endif()
#
#get_target_property(torch_interface_includes
# torch INTERFACE_INCLUDE_DIRECTORIES)
#if ( torch_interface_includes )
# list(APPEND AMS_APP_INCLUDES ${torch_interface_includes})
#endif()
#
#get_target_property(torch_interface_defines
# torch INTERFACE_COMPILE_DEFINITIONS)
#if ( troch_interface_defines )
# list(APPEND AMS_APP_DEFINES ${torch_interface_defines})
#endif()
#
#get_target_property(torch_interface_compile_options
# torch INTERFACE_COMPILE_OPTIONS)
#if ( torch_interface_compile_options )
# list(APPEND AMS_APP_DEFINES ${torch_interface_compile_options})
#endif()
#
#get_target_property(_interface_link_directories
# ${arg_FROM} INTERFACE_LINK_DIRECTORIES)
#if ( _interface_link_directories )
# target_link_directories( ${arg_TO} ${_scope} ${_interface_link_directories})
#endif()
#
#get_target_property(torch_interface_link_libraries
# torch INTERFACE_LINK_LIBRARIES)
#if ( torch_interface_link_libraries )
# list(APPEND AMS_APP_LIBRARIES "${torch_interface_link_libraries}")
#endif()

list(APPEND AMS_TORCH_LIBRARY torch)
list(APPEND AMS_APP_DEFINES "-D__ENABLE_TORCH__")
set(BLA_VENDER OpenBLAS)
find_package(BLAS REQUIRED)
list(APPEND AMS_APP_LIBRARIES "${BLAS_LIBRARIES}")
#set(BLA_VENDER OpenBLAS)
#find_package(BLAS REQUIRED)
#list(APPEND AMS_APP_LIBRARIES "${BLAS_LIBRARIES}")
endif()

# ------------------------------------------------------------------------------
Expand Down Expand Up @@ -256,6 +297,98 @@ if (WITH_PERFFLOWASPECT)
endif()


macro(inherit_target_nostatic)
set(options)
set(singleValueArgs TO FROM OBJECT)
set(multiValueArgs)

# Parse the arguments
cmake_parse_arguments(arg "${options}" "${singleValueArgs}"
"${multiValueArgs}" ${ARGN} )

# Check arguments
if ( NOT DEFINED arg_TO )
message( FATAL_ERROR "Must provide a TO argument to the 'blt_inherit_target' macro" )
endif()

if ( NOT DEFINED arg_FROM )
message( FATAL_ERROR "Must provide a FROM argument to the 'blt_inherit_target' macro" )
endif()

set(_scope INTERFACE)

get_target_property(_interface_system_includes
${arg_FROM} INTERFACE_SYSTEM_INCLUDE_DIRECTORIES)
if ( _interface_system_includes )
target_include_directories(${arg_TO} SYSTEM ${_scope} ${_interface_system_includes})
endif()

get_target_property(_interface_includes
${arg_FROM} INTERFACE_INCLUDE_DIRECTORIES)
if ( _interface_includes )
target_include_directories(${arg_TO} ${_scope} ${_interface_includes})
endif()

get_target_property(_interface_defines
${arg_FROM} INTERFACE_COMPILE_DEFINITIONS)
if ( _interface_defines )
target_compile_definitions( ${arg_TO} ${_scope} ${_interface_defines})
endif()

if( ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.13.0" )
get_target_property(_interface_link_options
${arg_FROM} INTERFACE_LINK_OPTIONS)
if ( _interface_link_options )
target_link_options( ${arg_TO} ${_scope} ${_interface_link_options})
endif()
endif()

get_target_property(_interface_compile_options
${arg_FROM} INTERFACE_COMPILE_OPTIONS)
if ( _interface_compile_options )
target_compile_options( ${arg_TO} ${_scope} ${_interface_compile_options})
endif()

if ( NOT arg_OBJECT )
#get_target_property(_interface_link_directories
# ${arg_FROM} INTERFACE_LINK_DIRECTORIES)
#if ( _interface_link_directories )
# target_link_directories( ${arg_TO} ${_scope} ${_interface_link_directories})
#endif()

#get_target_property(_interface_link_libraries
# ${arg_FROM} INTERFACE_LINK_LIBRARIES)
#if ( _interface_link_libraries )
# target_link_libraries( ${arg_TO} ${_scope} ${_interface_link_libraries})
#endif()
endif()

endmacro(inherit_target_nostatic)


if (EXCLUDE_STATIC_LIBS)
set(NONSTATIC_AMS_APP_INTERFACE_LIBRARIES "")
set(NONSTATIC_AMS_APP_PRIVATE_LIBRARIES "")
foreach (THIS_LIB ${AMS_APP_LIBRARIES})
list(APPEND NONSTATIC_AMS_APP_INTERFACE_LIBRARIES ${THIS_LIB})
if (TARGET ${THIS_LIB})
get_target_property(target_type ${THIS_LIB} TYPE)
if (target_type STREQUAL STATIC_LIBRARY)
add_library("${THIS_LIB}::nostatic" INTERFACE IMPORTED)
inherit_target_nostatic(TO "${THIS_LIB}::nostatic" FROM ${THIS_LIB})
list(APPEND NONSTATIC_AMS_APP_PRIVATE_LIBRARIES "${THIS_LIB}::nostatic")
else()
list(APPEND NONSTATIC_AMS_APP_PRIVATE_LIBRARIES ${THIS_LIB})
endif()
else()
get_filename_component(THIS_EXT ${THIS_LIB} EXT)
if (NOT ".a" STREQUAL "${THIS_EXT}")
list(APPEND NONSTATIC_AMS_APP_PRIVATE_LIBRARIES ${THIS_LIB})
endif()
endif()
endforeach()
endif()

add_subdirectory(src)

# ------------------------------------------------------------------------------
Expand Down
2 changes: 1 addition & 1 deletion examples/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ int run(const char *device_name,
std::default_random_engine generator;
std::normal_distribution<double> distribution(avg, stdDev);
threshold = distribution(generator);
#ifdef __ENABLE_MPI__
#ifdef __AMS_ENABLE_MPI__
if (wS > 1) {
if (rId == 0) {
for (int i = 1; i < wS; i++) {
Expand Down
2 changes: 1 addition & 1 deletion src/AMSlib/AMS.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -595,7 +595,7 @@ AMSExecutor AMSCreateExecutor(AMSCAbstrModel model,
}
}

#ifdef __ENABLE_MPI__
#ifdef __AMS_ENABLE_MPI__
AMSExecutor AMSCreateDistributedExecutor(AMSCAbstrModel model,
AMSDType data_type,
AMSResourceType resource_type,
Expand Down
11 changes: 9 additions & 2 deletions src/AMSlib/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,14 @@ target_include_directories(AMS PUBLIC
$<INSTALL_INTERFACE:include/>)
target_include_directories(AMS PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
target_link_directories(AMS PUBLIC ${AMS_APP_LIB_DIRS})
target_link_libraries(AMS PUBLIC ${AMS_APP_LIBRARIES} stdc++fs)
if (EXCLUDE_STATIC_LIBS)
target_link_libraries(AMS PRIVATE ${NONSTATIC_AMS_APP_PRIVATE_LIBRARIES} ${AMS_APP_PRIVATE_LIBRARIES} ${AMS_TORCH_LIBRARY} stdc++fs stdc++ /usr/tce/packages/intel/intel-2022.1.0/compiler/2022.1.0/linux/compiler/lib/intel64_lin/libintlc.so m)
target_link_libraries(AMS INTERFACE ${NONSTATIC_AMS_APP_INTERFACE_LIBRARIES} stdc++fs stdc++ /usr/tce/packages/intel/intel-2022.1.0/compiler/2022.1.0/linux/compiler/lib/intel64_lin/libintlc.so m)
target_link_options(AMS PRIVATE "-Wl,--unresolved-symbols=ignore-all")
else()
target_link_libraries(AMS PUBLIC ${AMS_APP_LIBRARIES} stdc++fs stdc++ /usr/tce/packages/intel/intel-2022.1.0/compiler/2022.1.0/linux/compiler/lib/intel64_lin/libintlc.so m)
target_link_libraries(AMS PRIVATE ${AMS_APP_PRIVATE_LIBRARIES})
endif()

#-------------------------------------------------------------------------------
# create the configuration header file with the respective information
Expand Down Expand Up @@ -83,7 +90,7 @@ install(TARGETS AMS
DESTINATION lib)

install(EXPORT AMSTargets
FILE AMS.cmake
FILE AMSConfig.cmake
DESTINATION lib/cmake/AMS)

install(FILES ${PROJECT_BINARY_DIR}/include/AMS.h DESTINATION include)
Expand Down
5 changes: 2 additions & 3 deletions src/AMSlib/include/AMS.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,13 @@
#define CALIPER(stmt)
#endif

#ifdef __ENABLE_MPI__
#ifdef __AMS_ENABLE_MPI__
#include <mpi.h>
#define MPI_CALL(stmt) \
if (stmt != MPI_SUCCESS) { \
fprintf(stderr, "Error in MPI-Call (File: %s, %d)\n", __FILE__, __LINE__); \
}
#else
typedef void *MPI_Comm;
#define MPI_CALL(stm)
#endif

Expand Down Expand Up @@ -78,7 +77,7 @@ AMSExecutor AMSCreateExecutor(AMSCAbstrModel model,
int process_id,
int world_size);

#ifdef __ENABLE_MPI__
#ifdef __AMS_ENABLE_MPI__
AMSExecutor AMSCreateDistributedExecutor(AMSCAbstrModel model,
AMSDType data_type,
AMSResourceType resource_type,
Expand Down
12 changes: 6 additions & 6 deletions src/AMSlib/wf/basedb.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1029,7 +1029,7 @@ class AMSMessage
_data(nullptr),
_total_size(0)
{
#ifdef __ENABLE_MPI__
#ifdef __AMS_ENABLE_MPI__
MPI_CALL(MPI_Comm_rank(MPI_COMM_WORLD, &_rank));
#endif
AMSMsgHeader header(_rank,
Expand Down Expand Up @@ -1072,7 +1072,7 @@ class AMSMessage
auto header = AMSMsgHeader::decode(data);

int current_rank = 0;
#ifdef __ENABLE_MPI__
#ifdef __AMS_ENABLE_MPI__
MPI_CALL(MPI_Comm_rank(MPI_COMM_WORLD, &current_rank));
#endif
_rank = header.mpi_rank;
Expand Down Expand Up @@ -1234,7 +1234,7 @@ class RMQConsumerHandler final : public AMQP::LibEventHandler
_messages(std::make_shared<std::vector<inbound_msg>>()),
_channel(nullptr)
{
#ifdef __ENABLE_MPI__
#ifdef __AMS_ENABLE_MPI__
MPI_CALL(MPI_Comm_rank(MPI_COMM_WORLD, &_rank));
#endif
}
Expand Down Expand Up @@ -1473,7 +1473,7 @@ class RMQConsumer
std::string queue)
: _rank(0), _queue(queue), _cacert(cacert), _handler(nullptr)
{
#ifdef __ENABLE_MPI__
#ifdef __AMS_ENABLE_MPI__
MPI_CALL(MPI_Comm_rank(MPI_COMM_WORLD, &_rank));
#endif
#ifdef EVTHREAD_USE_PTHREADS_IMPLEMENTED
Expand Down Expand Up @@ -1618,7 +1618,7 @@ class RMQPublisherHandler final : public AMQP::LibEventHandler
_channel(nullptr),
_rchannel(nullptr)
{
#ifdef __ENABLE_MPI__
#ifdef __AMS_ENABLE_MPI__
MPI_CALL(MPI_Comm_rank(MPI_COMM_WORLD, &_rank));
#endif
established = establish_connection.get_future();
Expand Down Expand Up @@ -2023,7 +2023,7 @@ class RMQPublisher
_handler(nullptr),
_buffer_msg(std::move(msgs_to_send))
{
#ifdef __ENABLE_MPI__
#ifdef __AMS_ENABLE_MPI__
MPI_CALL(MPI_Comm_rank(MPI_COMM_WORLD, &_rank));
#endif
#ifdef EVTHREAD_USE_PTHREADS_IMPLEMENTED
Expand Down
Loading
Loading