From 5a26ae6a93a5731f49876d5c23c6db155824a90b Mon Sep 17 00:00:00 2001 From: Ye Luo Date: Thu, 17 Nov 2016 04:19:48 +0000 Subject: [PATCH] Improve the integration of LMYEngine with QMCPACK. BUILD_LMYENGINE_INTERFACE is exposed at the QMCPACK entry level and cached. formic library is treated like einspline, placed after all qmc libs and before math and utility. Less pain to handle blas lapack fortran libs. Remove a bunch of TARGET_LINK_LIBRARIES which can be messed up very easily. Move LMYEngineInterface under QMCDriver. So stay close to the class definition. git-svn-id: https://subversion.assembla.com/svn/qmcdev/branches/new_optimizer@7233 e5b18d87-469d-4833-9cc0-8cdfa06e9491 --- CMakeLists.txt | 8 ++++ config/BGQ_Clang++11_ToolChain.cmake | 2 +- src/CMakeLists.txt | 7 --- src/LMYEngineInterface/CMakeLists.txt | 47 ------------------- src/QMCApp/CMakeLists.txt | 4 -- src/QMCDrivers/CMakeLists.txt | 12 +++-- .../LMYE_QMCCostFunctionOMP.cpp | 0 .../LMYE_QMCFixedSampleLinearOptimize.cpp | 0 .../QMCFixedSampleLinearOptimize.cpp | 2 +- src/formic/utils/CMakeLists.txt | 2 +- src/formic/utils/lapack_interface.cpp | 1 + src/formic/utils/mangle_other.h | 16 +++++++ 12 files changed, 35 insertions(+), 66 deletions(-) delete mode 100644 src/LMYEngineInterface/CMakeLists.txt rename src/{ => QMCDrivers}/LMYEngineInterface/LMYE_QMCCostFunctionOMP.cpp (100%) rename src/{ => QMCDrivers}/LMYEngineInterface/LMYE_QMCFixedSampleLinearOptimize.cpp (100%) create mode 100644 src/formic/utils/mangle_other.h diff --git a/CMakeLists.txt b/CMakeLists.txt index f0a69908c..9c80fd536 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -112,6 +112,7 @@ SET(PRINT_DEBUG 0 CACHE BOOL "Enable/disable debug printing") SET(QMC_CUDA 0 CACHE BOOL "Build with GPU support through CUDA") SET(QMC_ADIOS 0 CACHE BOOL "Build with ADIOS") SET(BUILD_UNIT_TESTS 1 CACHE BOOL "Build unit tests") +SET(BUILD_LMYENGINE_INTERFACE 1 CACHE BOOL "Build LMY engine") ###################################################################### # set debug printout @@ -673,6 +674,13 @@ if(build_einspline) SET(QMC_UTIL_LIBS einspline ${QMC_UTIL_LIBS}) endif() +IF(BUILD_LMYENGINE_INTERFACE) + ADD_DEFINITIONS(-DHAVE_LMY_ENGINE) + SET(FORMIC_BINARY_DIR ${qmcpack_BINARY_DIR}) + SUBDIRS(src/formic/utils) + SET(QMC_UTIL_LIBS formic_utils ${QMC_UTIL_LIBS}) +ENDIF(BUILD_LMYENGINE_INTERFACE) + #include(ExternalProject) # set(einspline_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/einspline") # set(einspline_INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/einspline") diff --git a/config/BGQ_Clang++11_ToolChain.cmake b/config/BGQ_Clang++11_ToolChain.cmake index f1581ef00..6c9b20cb8 100644 --- a/config/BGQ_Clang++11_ToolChain.cmake +++ b/config/BGQ_Clang++11_ToolChain.cmake @@ -2,7 +2,7 @@ set(CMAKE_C_COMPILER mpiclang) set(CMAKE_CXX_COMPILER mpiclang++11) set(GNU_OPTS "-O3 -g -ffast-math -fopenmp -fstrict-aliasing -Wno-deprecated -Wswitch -Wunused-value") -set(GNU_FLAGS "-Drestrict=__restrict__ -DADD_ -DINLINE_ALL=inline -DDISABLE_TIMER=1 -DHAVE_MASS -DHAVE_MASSV -DUSE_REAL_STRUCT_FACTOR -DSPLINEFLOAT -DBGQPX") +set(GNU_FLAGS "-Drestrict=__restrict__ -DADD_ -DHAVE_MASS -DHAVE_MASSV -DSPLINEFLOAT -DBGQPX") set(CMAKE_CXX_FLAGS "${GNU_FLAGS} ${GNU_OPTS} -ftemplate-depth-60") set(CMAKE_C_FLAGS "${GNU_FLAGS} ${GNU_OPTS} -std=c99" ) SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--allow-multiple-definition") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 511efdd0e..5868af330 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -201,13 +201,6 @@ else() SUBDIRS(QMCDrivers) SUBDIRS(QMCApp) - IF(BUILD_LMYENGINE_INTERFACE) - ADD_DEFINITIONS(-DHAVE_LMY_ENGINE) - SET(FORMIC_BINARY_DIR ${qmcpack_BINARY_DIR}) - SUBDIRS(formic/utils) - SUBDIRS(LMYEngineInterface) - ENDIF(BUILD_LMYENGINE_INTERFACE) - #IF(BUILD_QMCTOOLS) SUBDIRS(QMCTools) #ENDIF(BUILD_QMCTOOLS) diff --git a/src/LMYEngineInterface/CMakeLists.txt b/src/LMYEngineInterface/CMakeLists.txt deleted file mode 100644 index 210b871d0..000000000 --- a/src/LMYEngineInterface/CMakeLists.txt +++ /dev/null @@ -1,47 +0,0 @@ -# find the LMYEngine library -#FIND_LIBRARY(LMYENGINE_LIB lmyengine) -MESSAGE("-- LMYENGINE_LIB=${LMYENGINE_LIB}") - -set(LMY_LIBS "${LMYENGINE_LIB}") - -#ADD_DEFINITIONS(-DHAVE_LMY_ENGINE) -# find the LMYEngine header file add it to the includes -#FIND_PATH(LMYENGINE_INCLUDE_DIR formic/fqmc/engine/var_dependencies.h) -#MESSAGE("-- LMYENGINE_INCLUDE_DIR=${LMYENGINE_INCLUDE_DIR}") -#INCLUDE_DIRECTORIES(${LMYENGINE_INCLUDE_DIR}) - -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") -add_library(lmy_engine_interface LMYE_QMCCostFunctionOMP.cpp - LMYE_QMCFixedSampleLinearOptimize.cpp - ) - -set_property(TARGET lmy_engine_interface PROPERTY CXX_STANDARD 11) -set_property(TARGET lmy_engine_interface PROPERTY CXX_STANDARD_REQUIRED ON) - -# find the atlas libraries that lmy depends on -#find_library(LMY_ATLAS_LIB_ATLAS atlas) -#find_library(LMY_ATLAS_LIB_CBLAS cblas) -#find_library(LMY_ATLAS_LIB_F77BLAS f77blas) -#find_library(LMY_ATLAS_LIB_LAPACK lapack) -#if(LMY_ATLAS_LIB_ATLAS AND LMY_ATLAS_LIB_CBLAS AND LMY_ATLAS_LIB_F77BLAS AND LMY_ATLAS_LIB_LAPACK) -# message(STATUS "Found ATLAS for LMY") -# set(LMY_LIBS "${LMY_LIBS};${LMY_ATLAS_LIB_LAPACK};${LMY_ATLAS_LIB_F77BLAS};${LMY_ATLAS_LIB_CBLAS};${LMY_ATLAS_LIB_ATLAS}") -#else(LMY_ATLAS_LIB_ATLAS AND LMY_ATLAS_LIB_CBLAS AND LMY_ATLAS_LIB_F77BLAS AND LMY_ATLAS_LIB_LAPACK) -#endif(LMY_ATLAS_LIB_ATLAS AND LMY_ATLAS_LIB_CBLAS AND LMY_ATLAS_LIB_F77BLAS AND LMY_ATLAS_LIB_LAPACK) - -#if(CMAKE_COMPILER_IS_GNUCXX) -# set(LMY_LIBS ${LMY_LIBS};m;gfortran) -#endif(CMAKE_COMPILER_IS_GNUCXX) - -target_link_libraries(lmy_engine_interface ${LMY_LIBS}) - -#install( -# TARGETS -# lmy_engine_interface -# RUNTIME DESTINATION -# bin -# LIBRARY DESTINATION -# lib -# ARCHIVE DESTINATION -# lib -# ) diff --git a/src/QMCApp/CMakeLists.txt b/src/QMCApp/CMakeLists.txt index 2b131be9a..6181e25e9 100644 --- a/src/QMCApp/CMakeLists.txt +++ b/src/QMCApp/CMakeLists.txt @@ -67,9 +67,5 @@ ENDIF() TARGET_LINK_LIBRARIES(${p} ${MPI_LIBRARY}) ENDIF(MPI_LIBRARY) - IF(BUILD_LMYENGINE_INTERFACE) - TARGET_LINK_LIBRARIES(${p} formic_utils) - ENDIF(BUILD_LMYENGINE_INTERFACE) - ENDFOREACH(p ${QMCSRCS}) diff --git a/src/QMCDrivers/CMakeLists.txt b/src/QMCDrivers/CMakeLists.txt index 0061d5f05..1941a95ac 100644 --- a/src/QMCDrivers/CMakeLists.txt +++ b/src/QMCDrivers/CMakeLists.txt @@ -95,6 +95,13 @@ IF(HAVE_MPI) DMC/WalkerReconfigurationMPI.cpp) ENDIF(HAVE_MPI) +# if using the LMYEngine interface, make sure we add the necessary functions +IF(BUILD_LMYENGINE_INTERFACE) + SET(QMCDRIVERS ${QMCDRIVERS} + LMYEngineInterface/LMYE_QMCCostFunctionOMP.cpp + LMYEngineInterface/LMYE_QMCFixedSampleLinearOptimize.cpp + ) +ENDIF(BUILD_LMYENGINE_INTERFACE) IF(QMC_BUILD_LEVEL GREATER 1) SET(QMCDRIVERS ${QMCDRIVERS} @@ -136,8 +143,3 @@ ENDIF() #ELSE(QMC_BUILD_STATIC) # ADD_LIBRARY(qmcdriver SHARED ${QMCDRIVERS}) #ENDIF(QMC_BUILD_STATIC) - -# if using the LMYEngine interface, make sure we link in the necessary functions -IF(BUILD_LMYENGINE_INTERFACE) - TARGET_LINK_LIBRARIES(qmcdriver lmy_engine_interface) -ENDIF(BUILD_LMYENGINE_INTERFACE) diff --git a/src/LMYEngineInterface/LMYE_QMCCostFunctionOMP.cpp b/src/QMCDrivers/LMYEngineInterface/LMYE_QMCCostFunctionOMP.cpp similarity index 100% rename from src/LMYEngineInterface/LMYE_QMCCostFunctionOMP.cpp rename to src/QMCDrivers/LMYEngineInterface/LMYE_QMCCostFunctionOMP.cpp diff --git a/src/LMYEngineInterface/LMYE_QMCFixedSampleLinearOptimize.cpp b/src/QMCDrivers/LMYEngineInterface/LMYE_QMCFixedSampleLinearOptimize.cpp similarity index 100% rename from src/LMYEngineInterface/LMYE_QMCFixedSampleLinearOptimize.cpp rename to src/QMCDrivers/LMYEngineInterface/LMYE_QMCFixedSampleLinearOptimize.cpp diff --git a/src/QMCDrivers/QMCFixedSampleLinearOptimize.cpp b/src/QMCDrivers/QMCFixedSampleLinearOptimize.cpp index 62d538b96..99df9e839 100644 --- a/src/QMCDrivers/QMCFixedSampleLinearOptimize.cpp +++ b/src/QMCDrivers/QMCFixedSampleLinearOptimize.cpp @@ -749,7 +749,7 @@ bool QMCFixedSampleLinearOptimize::adaptive_three_shift_run() { const std::vector shifts_s = this->prepare_shifts(this->bestShift_s); std::vector shift_scales(shifts_i.size(), 1.0); for (int i = 0; i < shift_scales.size(); i++) - shift_scales.at(i) = shifts_i.at(i) / shifts_i.at(central_index); + shift_scales.at(i) = shifts_i.at(i) / shift_i; // ensure the cost function is set to compute derivative vectors this->optTarget->setneedGrads(true); diff --git a/src/formic/utils/CMakeLists.txt b/src/formic/utils/CMakeLists.txt index f171d8558..caa10cc36 100644 --- a/src/formic/utils/CMakeLists.txt +++ b/src/formic/utils/CMakeLists.txt @@ -15,7 +15,7 @@ if(MKL_FOUND) else(MKL_FOUND) # use the fortran-C interface mangling determined by cmake # this should be correct so long as the same compilers were used to build blas/lapack - FortranCInterface_HEADER(${FORMIC_BINARY_DIR}/src/formic/utils/mangle_other.h MACRO_NAMESPACE "FC_") + # FortranCInterface_HEADER(${FORMIC_BINARY_DIR}/src/formic/utils/mangle_other.h MACRO_NAMESPACE "FC_") set(LAPACK_DECLARE_INC formic/utils/declare_other.h) set(LAPACK_MANGLE_INC formic/utils/mangle_other.h) endif(MKL_FOUND) diff --git a/src/formic/utils/lapack_interface.cpp b/src/formic/utils/lapack_interface.cpp index b71b4981b..a525ccc54 100644 --- a/src/formic/utils/lapack_interface.cpp +++ b/src/formic/utils/lapack_interface.cpp @@ -1,6 +1,7 @@ #include #include #include +#include // complex conjugate of a vector void formic::xconj(const int n, double * const y, const int incy) { diff --git a/src/formic/utils/mangle_other.h b/src/formic/utils/mangle_other.h new file mode 100644 index 000000000..ba9a64e74 --- /dev/null +++ b/src/formic/utils/mangle_other.h @@ -0,0 +1,16 @@ +#ifndef FC_HEADER_INCLUDED +#define FC_HEADER_INCLUDED + +/* Mangling for Fortran global symbols without underscores. */ +#define FC_GLOBAL(name,NAME) name##_ + +/* Mangling for Fortran global symbols with underscores. */ +#define FC_GLOBAL_(name,NAME) name##_ + +/* Mangling for Fortran module symbols without underscores. */ +#define FC_MODULE(mod_name,name, mod_NAME,NAME) mod_name##_mp_##name##_ + +/* Mangling for Fortran module symbols with underscores. */ +#define FC_MODULE_(mod_name,name, mod_NAME,NAME) mod_name##_mp_##name##_ + +#endif