diff --git a/CMake/config/ReleaseDebugAutoFlags.cmake b/CMake/config/ReleaseDebugAutoFlags.cmake index c1030c259..c3f47d966 100644 --- a/CMake/config/ReleaseDebugAutoFlags.cmake +++ b/CMake/config/ReleaseDebugAutoFlags.cmake @@ -47,15 +47,15 @@ endif() include(CompilerFlagsHelpers) -set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_WARNING_ALL} ${CMAKE_C_OPT_NORMAL}") -set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_DEBUGINFO_FLAGS} ${CMAKE_C_WARNING_ALL} ${CMAKE_C_OPT_NONE} ${CMAKE_C_STACK_PROTECTION}") -set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_DEBUGINFO_FLAGS} ${CMAKE_C_WARNING_ALL} ${CMAKE_C_OPT_NORMAL}") -set(CMAKE_C_FLAGS_FAST "${CMAKE_C_WARNING_ALL} ${CMAKE_C_OPT_FASTEST} ${CMAKE_C_LINK_TIME_OPT} ${CMAKE_C_GEN_NATIVE}") +set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_OPT_NORMAL}") +set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_DEBUGINFO_FLAGS} ${CMAKE_C_OPT_NONE} ${CMAKE_C_STACK_PROTECTION}") +set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_DEBUGINFO_FLAGS} ${CMAKE_C_OPT_NORMAL}") +set(CMAKE_C_FLAGS_FAST " ${CMAKE_C_OPT_FASTEST} ${CMAKE_C_LINK_TIME_OPT} ${CMAKE_C_GEN_NATIVE}") -set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_WARNING_ALL} ${CMAKE_CXX_OPT_NORMAL}") -set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_DEBUGINFO_FLAGS} ${CMAKE_CXX_WARNING_ALL} ${CMAKE_CXX_OPT_NONE} ${CMAKE_CXX_STACK_PROTECTION}") -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_DEBUGINFO_FLAGS} ${CMAKE_CXX_WARNING_ALL} ${CMAKE_CXX_OPT_NORMAL}") -set(CMAKE_CXX_FLAGS_FAST "${CMAKE_CXX_WARNING_ALL} ${CMAKE_CXX_OPT_FASTEST} ${CMAKE_CXX_LINK_TIME_OPT} ${CMAKE_CXX_GEN_NATIVE}") +set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_OPT_NORMAL}") +set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_DEBUGINFO_FLAGS} ${CMAKE_CXX_OPT_NONE} ${CMAKE_CXX_STACK_PROTECTION}") +set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_DEBUGINFO_FLAGS} ${CMAKE_CXX_OPT_NORMAL}") +set(CMAKE_CXX_FLAGS_FAST " ${CMAKE_CXX_OPT_FASTEST} ${CMAKE_CXX_LINK_TIME_OPT} ${CMAKE_CXX_GEN_NATIVE}") diff --git a/CMake/config/SetRpath.cmake b/CMake/config/SetRpath.cmake index 93558f02a..d86ec902e 100644 --- a/CMake/config/SetRpath.cmake +++ b/CMake/config/SetRpath.cmake @@ -14,6 +14,8 @@ IF( NOT BLUEGENE AND NOT CRAY_SYSTEM) # which point to directories outside the build tree to the install RPATH SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) + set(LIB_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}") + # the RPATH to be used when installing, but only if it's not a system directory LIST(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${LIB_INSTALL_DIR}" isSystemDir) IF("${isSystemDir}" STREQUAL "-1") diff --git a/CMakeLists.txt b/CMakeLists.txt index 995aa26b9..e10a03de5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -216,6 +216,7 @@ if(${CMAKE_C_COMPILER_ID} STREQUAL "PGI") endif() if(ENABLE_OPENACC) + set(COMPILE_LIBRARY_TYPE "STATIC") if(${CMAKE_C_COMPILER_ID} STREQUAL "PGI") add_definitions( -DPG_ACC_BUGS) set(ACC_FLAGS "-acc -Minline=size:200,levels:10") @@ -232,7 +233,6 @@ if(ENABLE_OPENACC) if(ENABLE_CUDA_MODULES) find_package(CUDA 5.0) SET(CUDA_SEPARABLE_COMPILATION ON) - if(CUDA_FOUND) if(ENABLE_SELECTIVE_GPU_PROFILING) add_definitions( -DCUDA_PROFILING) @@ -253,6 +253,7 @@ ELSE(ENABLE_OPENACC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${IGNORE_UNKNOWN_PRAGMA_FLAGS}") endif(ENABLE_OPENACC) + if(DISABLE_NRN_TIMEOUT) add_definitions("-DDISABLE_TIMEOUT") endif() diff --git a/apps/CMakeLists.txt b/apps/CMakeLists.txt index f3dec67a8..70e4c7bdc 100644 --- a/apps/CMakeLists.txt +++ b/apps/CMakeLists.txt @@ -27,21 +27,15 @@ include_directories(${PROJECT_SOURCE_DIR} ${PROJECT_SOURCE_DIR}/coreneuron ${CMAKE_CURRENT_SOURCE_DIR} ${PROJECT_BINARY_DIR}/coreneuron) -# The mechanism registration function will be always defined from extra mechanisms in test directory -add_definitions(-DADDITIONAL_MECHS) - -# LIbrary required for special -add_library(coreneuron_main STATIC "coreneuron.cpp") - add_executable(coreneuron_exec "${CMAKE_CURRENT_SOURCE_DIR}/coreneuron.cpp") -set_target_properties(coreneuron_exec PROPERTIES - OUTPUT_NAME "coreneuron_exec") - -target_link_libraries(coreneuron_exec coreneuron ${MPI_C_LIBRARIES} ${MPI_CXX_LIBRARIES} ${reportinglib_LIBRARY}) +target_link_libraries(coreneuron_exec corenrnmech + ${MPI_C_LIBRARIES} ${MPI_CXX_LIBRARIES} ${reportinglib_LIBRARY}) install(TARGETS coreneuron_exec DESTINATION "${CMAKE_INSTALL_BINDIR}") -install(TARGETS coreneuron_main - DESTINATION "${CMAKE_INSTALL_LIBDIR}") + +# Install main to recompile for special-core +install(FILES coreneuron.cpp + DESTINATION ${CMAKE_INSTALL_DATADIR}/coreneuron) diff --git a/apps/coreneuron.cpp b/apps/coreneuron.cpp index 1026cfccf..b81b1f44c 100644 --- a/apps/coreneuron.cpp +++ b/apps/coreneuron.cpp @@ -26,14 +26,8 @@ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include -extern "C" {extern void modl_reg(void);} +#include int main(int argc, char** argv) { - return solve_core(argc, argv); + return solve_core(argc, argv); } - -/// Declare an empty function if Neurodamus mechanisms are not used, otherwise register them in mechs/cfile/mod_func.c -#ifndef ADDITIONAL_MECHS -void modl_reg() {} -#endif diff --git a/coreneuron/CMakeLists.txt b/coreneuron/CMakeLists.txt index cc01a117f..2b623228d 100644 --- a/coreneuron/CMakeLists.txt +++ b/coreneuron/CMakeLists.txt @@ -29,10 +29,14 @@ include_directories(utils/randoms) include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) include_directories(${MPI_INCLUDE_PATH}) -FILE(GLOB_RECURSE coreneuron_all_headers "*.h*") -FILE(GLOB_RECURSE coreneuron_all_templates "*.ipp") -FILE(GLOB_RECURSE coreneuron_all_c_files "*.c*") +file(GLOB_RECURSE coreneuron_all_headers "*.h*") +file(GLOB_RECURSE coreneuron_all_templates "*.ipp") file(GLOB_RECURSE coreneuron_cuda_files "*.cu") +file(GLOB_RECURSE coreneuron_all_c_files "nrniv/*.c*" "nrnmpi/*.c*" "nrnoc/*.c*" + "nrnomp/*.c*" "utils/*.c*") +set(DIMPLIC_C "mech/dimplic.cpp") +file(GLOB_RECURSE scopmath_c_files "scopmath_core/*.c*") + # Compile and include MOD files @@ -228,6 +232,7 @@ add_custom_command(OUTPUT "${KINDERIV_H}" DEPENDS ${MOD2C_OPTMECH_OUTPUTS} ${MOD2C_STDMECH_OUTPUTS} "${KINDERIV_PY}" COMMAND python "${KINDERIV_PY}" WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}") +add_custom_target(kinderiv DEPENDS "${KINDERIV_H}") if (EXPORT_MECHS_FUNCTIONS) # Create C file with all "get function pointers" methods @@ -242,7 +247,8 @@ if (EXPORT_MECHS_FUNCTIONS) endif() # Add generated sources from MOD files -set(GENERATED_MECH_C_FILES ${MOD_FUNC_C} ${MOD_FUNC_PTRS_C} ${MOD2C_STDMECH_OUTPUTS} ${MOD2C_OPTMECH_OUTPUTS}) +set(ADDITIONAL_MECH_C_FILES ${MOD_FUNC_C} ${MOD_FUNC_PTRS_C} ${DIMPLIC_C} ${MOD2C_OPTMECH_OUTPUTS}) +set(GENERATED_MECH_C_FILES ${ADDITIONAL_MECH_C_FILES} ${MOD2C_STDMECH_OUTPUTS}) # artificial cells must be on cpu, defaul nrnran123.c is for cpu, nrn_setup.cpp uses nrnran123 for only memory calculation purpose which should use cpu version of nrnran123 set(NOACC_MECH_C_FILES @@ -261,8 +267,6 @@ if(ENABLE_OPENACC) endif() endif() -set(coreneuron_all_c_files ${coreneuron_all_c_files} ${GENERATED_MECH_C_FILES}) - #to indent generated c/cpp files if(CLANG_FORMAT_FOUND) add_custom_target(formatbuild @@ -275,8 +279,6 @@ if(CLANG_FORMAT_FOUND) endif() -add_library(coreneuron ${COMPILE_LIBRARY_TYPE} ${coreneuron_all_headers} ${coreneuron_all_templates} ${coreneuron_all_c_files} ${KINDERIV_H}) - set(link_cudacoreneuron) set(link_reportinglib) @@ -288,6 +290,7 @@ if(ENABLE_OPENACC AND ENABLE_CUDA_MODULES) -gencode=arch=compute_50,code=sm_50 -gencode=arch=compute_52,code=sm_52 -gencode=arch=compute_52,code=compute_52 + -Xcompiler -fPIC ) set(link_cudacoreneuron cudacoreneuron) endif() @@ -297,8 +300,20 @@ if(ENABLE_REPORTINGLIB) endif() + +############################################################ +# Target libs +############################################################ + +# +# The coreneuron lib (only internal mechanisms) +# +add_library(coreneuron ${COMPILE_LIBRARY_TYPE} ${coreneuron_all_headers} ${coreneuron_all_templates} + ${coreneuron_all_c_files} ${cudacorenrn_objs} ${MOD2C_STDMECH_OUTPUTS}) +add_dependencies(coreneuron kinderiv) + target_link_libraries(coreneuron ${MPI_CXX_LIBRARIES} - ${link_reportinglib} ${link_cudacoreneuron} ${CUDA_LIBRARIES} ) + ${link_reportinglib} ${link_cudacoreneuron} ${CUDA_LIBRARIES}) set_target_properties(coreneuron PROPERTIES VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH} @@ -315,31 +330,53 @@ set(CORENRN_LINK_LIBS ${CORENRN_LINK_LIBS} PARENT_SCOPE) set(CORENRN_OPTMECH_MODS "${MOD2C_OPTMECH_MODS}" PARENT_SCOPE) -install(TARGETS coreneuron +# The scopmath lib - should not contain dimplic +add_library(scopmath STATIC ${coreneuron_all_headers} ${scopmath_c_files}) +set_target_properties(scopmath PROPERTIES POSITION_INDEPENDENT_CODE ON) + +# +# The "complete" lib (coreneuron + opt mechs) +# +set(ENGINEMECH_C "mech/enginemech.cpp") +add_library(corenrnmech ${COMPILE_LIBRARY_TYPE} ${coreneuron_all_headers} ${ENGINEMECH_C} ${ADDITIONAL_MECH_C_FILES}) +add_dependencies(corenrnmech kinderiv) + +# The mechanism registration function will be always defined (at least for halfgap) +target_compile_definitions(corenrnmech PUBLIC -DADDITIONAL_MECHS) + +# Public link interface (default), so that end binary links with all, even if they'r static +target_link_libraries(corenrnmech scopmath coreneuron) + + +######################################################### +# INSTALL +######################################################### + +install(TARGETS coreneuron corenrnmech ${link_cudacoreneuron} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) -install(FILES "engine.h" +install(FILES "engine.h" "enginemech.h" DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/coreneuron) +install(PROGRAMS ${MOD2C_BINARY} + DESTINATION ${CMAKE_INSTALL_BINDIR}) + +install(FILES ${MOD2C_UNITS} + DESTINATION ${CMAKE_INSTALL_DATADIR}/mod2c) + + if(ENABLE_HEADER_INSTALL) install(DIRECTORY . DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/coreneuron FILES_MATCHING PATTERN "*.h*" PATTERN "*.ipp") - install(FILES ${KINDERIV_PY} + install(FILES ${KINDERIV_PY} ${MOD_FUNC_C_PL} ${DIMPLIC_C} ${ENGINEMECH_C} DESTINATION ${CMAKE_INSTALL_DATADIR}/coreneuron) - install(FILES ${MOD_FUNC_C_PL} + install(TARGETS scopmath DESTINATION ${CMAKE_INSTALL_DATADIR}/coreneuron) - install(DIRECTORY "scopmath_core" - DESTINATION ${CMAKE_INSTALL_DATADIR}/coreneuron - FILES_MATCHING PATTERN "dimplic.cpp") + install(FILES ${MOD2C_OPTMECH_OUTPUTS} + DESTINATION ${CMAKE_INSTALL_DATADIR}/mod2c) endif() - -install(PROGRAMS ${MOD2C_BINARY} - DESTINATION ${CMAKE_INSTALL_BINDIR}) - -install(FILES ${MOD2C_UNITS} - DESTINATION ${CMAKE_INSTALL_DATADIR}/mod2c) diff --git a/coreneuron/engine.h b/coreneuron/engine.h index 96fdf1d80..415d25252 100644 --- a/coreneuron/engine.h +++ b/coreneuron/engine.h @@ -4,7 +4,10 @@ #ifdef __cplusplus extern "C" { #endif -extern int solve_core(int argc, char** argv); + +extern void mk_mech_init(int argc, char** argv); +extern int run_solve_core(int argc, char** argv); + #ifdef __cplusplus } #endif diff --git a/coreneuron/enginemech.h b/coreneuron/enginemech.h new file mode 100644 index 000000000..45d0ed65e --- /dev/null +++ b/coreneuron/enginemech.h @@ -0,0 +1,14 @@ +#ifndef CORENEURON_ENGINEMECH_H +#define CORENEURON_ENGINEMECH_H + +#ifdef __cplusplus +extern "C" { +#endif + +int solve_core(int argc, char** argv); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/coreneuron/scopmath_core/dimplic.cpp b/coreneuron/mech/dimplic.cpp similarity index 100% rename from coreneuron/scopmath_core/dimplic.cpp rename to coreneuron/mech/dimplic.cpp diff --git a/coreneuron/mech/enginemech.cpp b/coreneuron/mech/enginemech.cpp new file mode 100644 index 000000000..1517cfc62 --- /dev/null +++ b/coreneuron/mech/enginemech.cpp @@ -0,0 +1,21 @@ +/// Corenrnmech is a wrapper lib providing a single solve_core function +/// which initializes the solver, loads the external mechanisms and launches the simulation + +#include +#include + +#ifdef ADDITIONAL_MECHS +namespace coreneuron{ extern void modl_reg(); } +#endif + +int solve_core(int argc, char** argv) { + + mk_mech_init(argc, argv); + +#ifdef ADDITIONAL_MECHS + /// Initializing additional Neurodamus mechanisms (in mod_func.c, built by mech/mod_func.c.pl) + coreneuron::modl_reg(); +#endif + + return run_solve_core(argc, argv); +} diff --git a/coreneuron/nrniv/cuda_profile.cu b/coreneuron/nrniv/cuda_profile.cu index 16bac0d1f..910f9fb15 100644 --- a/coreneuron/nrniv/cuda_profile.cu +++ b/coreneuron/nrniv/cuda_profile.cu @@ -22,10 +22,8 @@ void print_gpu_memory_usage() { void start_cuda_profile() { cudaProfilerStart(); - print_gpu_memory_usage(); } void stop_cuda_profile() { cudaProfilerStop(); - print_gpu_memory_usage(); } diff --git a/coreneuron/nrniv/main1.cpp b/coreneuron/nrniv/main1.cpp index 07ee7b6f1..3275f59fc 100644 --- a/coreneuron/nrniv/main1.cpp +++ b/coreneuron/nrniv/main1.cpp @@ -128,7 +128,8 @@ int corenrn_embedded_run(int nthread, int have_gaps, int use_mpi, const char* ar int argc = 0; char** argv; char* new_arg = prepare_args(argc, argv, use_mpi, arg); - solve_core(argc, argv); + mk_mech_init(argc, argv); + run_solve_core(argc, argv); free(new_arg); delete[] argv; @@ -147,6 +148,8 @@ int nrn_feenableexcept() { #endif namespace coreneuron { void call_prcellstate_for_prcellgid(int prcellgid, int compute_gpu, int is_init); + + void nrn_init_and_load_data(int argc, char* argv[], bool is_mapping_needed = false, @@ -195,15 +198,11 @@ void nrn_init_and_load_data(int argc, // full path of files.dat file std::string filesdat(nrnopt_get_str("--datpath") + "/" + nrnopt_get_str("--filesdat")); - // reads mechanism information from bbcore_mech.dat - mk_mech(nrnopt_get_str("--datpath").c_str()); // read the global variable names and set their values from globals.dat set_globals(nrnopt_get_str("--datpath").c_str(), nrnopt_get_flag("--seed"), nrnopt_get_int("--seed")); - report_mem_usage("After mk_mech"); - // set global variables for start time, timestep and temperature std::string restore_path = nrnopt_get_str("--restore"); t = restore_time(restore_path.c_str()); @@ -238,12 +237,21 @@ void nrn_init_and_load_data(int argc, use_interleave_permute = nrnopt_get_int("--cell-permute"); cellorder_nwarp = nrnopt_get_int("--nwarp"); use_solve_interleave = nrnopt_get_int("--cell-permute"); + #if LAYOUT == 1 // permuting not allowed for AoS use_interleave_permute = 0; use_solve_interleave = 0; #endif + if (nrnopt_get_flag("--gpu") && use_interleave_permute == 0) { + if (nrnmpi_myid == 0) { + printf(" WARNING : GPU execution requires --cell-permute type 1 or 2. Setting it to 1.\n"); + } + use_interleave_permute = 1; + use_solve_interleave = 1; + } + // pass by flag so existing tests do not need a changed nrn_setup prototype. nrn_setup_multiple = nrnopt_get_int("--multiple"); nrn_setup_extracon = nrnopt_get_int("--extracon"); @@ -344,17 +352,35 @@ const char* nrn_version(int) { } } // namespace coreneuron + + +/// The following high-level functions are marked as "extern C" +/// for compat with C, namely Neuron mod files. +/// They split the previous solve_core so that intermediate init of external mechanisms can occur. +/// See mech/corenrnmech.cpp for the new all-in-one solve_core (not compiled into the coreneuron +/// lib since with nrnivmodl-core we have 'future' external mechanisms) + using namespace coreneuron; -extern "C" int solve_core(int argc, char** argv) { -#if NRNMPI - nrnmpi_init(1, &argc, &argv); -#endif +extern "C" void mk_mech_init(int argc, char** argv) { // read command line parameters and parameter config files nrnopt_parse(argc, (const char**)argv); + + // reads mechanism information from bbcore_mech.dat + mk_mech(nrnopt_get_str("--datpath").c_str()); +} + + +extern "C" int run_solve_core(int argc, char** argv) { + +#if NRNMPI + nrnmpi_init(1, &argc, &argv); +#endif std::vector configs; bool reports_needs_finalize = false; + report_mem_usage("After mk_mech ang global initialization"); + if (nrnopt_get_str("--report-conf").size()) { if (nrnopt_get_int("--multiple") > 1) { if (nrnmpi_myid == 0) @@ -365,6 +391,7 @@ extern "C" int solve_core(int argc, char** argv) { reports_needs_finalize = configs.size(); } } + // initializationa and loading functions moved to separate nrn_init_and_load_data(argc, argv, configs.size() > 0); std::string checkpoint_path = nrnopt_get_str("--checkpoint"); diff --git a/coreneuron/nrniv/mk_mech.cpp b/coreneuron/nrniv/mk_mech.cpp index 7d07d3e96..3656502c3 100644 --- a/coreneuron/nrniv/mk_mech.cpp +++ b/coreneuron/nrniv/mk_mech.cpp @@ -181,9 +181,6 @@ static void mk_mech(std::istream& s) { (*mechanism[i])(); } - /// Calling the rest of additional Neurodamus or other _reg functions from the file mod_func.c - /// (built during the config time from mech/mod_func.c.pl) - modl_reg(); } /// Get mechanism type by the mechanism name diff --git a/coreneuron/nrniv/nrn_acc_manager.cpp b/coreneuron/nrniv/nrn_acc_manager.cpp index 5fa8e454a..a1e035682 100644 --- a/coreneuron/nrniv/nrn_acc_manager.cpp +++ b/coreneuron/nrniv/nrn_acc_manager.cpp @@ -53,8 +53,6 @@ void setup_nrnthreads_on_device(NrnThread* threads, int nthreads) { */ d_threads = (NrnThread*)acc_copyin(threads, sizeof(NrnThread) * nthreads); - printf("\n --- Copying to Device! --- "); - if (interleave_info == NULL) { printf("\n Warning: No permutation data? Required for linear algebra!"); } @@ -74,11 +72,6 @@ void setup_nrnthreads_on_device(NrnThread* threads, int nthreads) { double* d__data; // nrn_threads->_data on device - printf("\n -----------COPYING %d'th NrnThread TO DEVICE --------------- \n", i); -#if defined(CUDA_PROFILING) - print_gpu_memory_usage(); -#endif - /* -- copy _data to device -- */ /*copy all double data for thread */ @@ -401,9 +394,6 @@ void setup_nrnthreads_on_device(NrnThread* threads, int nthreads) { } else { printf("\n WARNING: NrnThread %d not permuted, error for linear algebra?", i); } - - printf("\n Compute thread on GPU? : %s, Stream : %d\n", (nt->compute_gpu) ? "Yes" : "No", - nt->stream_id); } if (nrn_ion_global_map_size) { diff --git a/coreneuron/nrniv/nrn_setup.cpp b/coreneuron/nrniv/nrn_setup.cpp index 3e297653a..b9aef0744 100644 --- a/coreneuron/nrniv/nrn_setup.cpp +++ b/coreneuron/nrniv/nrn_setup.cpp @@ -791,7 +791,7 @@ void nrn_setup(const char* filesdat, delete[] gidgroups; if (nrnmpi_myid == 0) { - printf(" Nrn Setup Done (time: %g)\n", nrn_wtime() - time); + printf(" Setup Done : %.2lf seconds \n", nrn_wtime() - time); } } diff --git a/coreneuron/utils/reports/nrnreport.cpp b/coreneuron/utils/reports/nrnreport.cpp index fd0fc6455..caf20461e 100644 --- a/coreneuron/utils/reports/nrnreport.cpp +++ b/coreneuron/utils/reports/nrnreport.cpp @@ -277,8 +277,8 @@ void register_compartment_report(NrnThread& nt, records_add_report((char*)config.output_path, gid, gid, gid, config.start, config.stop, config.report_dt, sizemapping, (char*)config.type_str, extramapping, (char*)config.unit); - - records_set_report_max_buffer_size_hint ((char*)config.output_path, config.buffer_size); + + records_set_report_max_buffer_size_hint ((char*)config.output_path, config.buffer_size); /** add extra mapping */ records_extra_mapping(config.output_path, gid, 5, extra); for (int var_idx = 0; var_idx < vars.size(); ++var_idx) { @@ -315,8 +315,8 @@ void register_custom_report(NrnThread& nt, records_add_report((char*)config.output_path, gid, gid, gid, config.start, config.stop, config.report_dt, sizemapping, (char*)config.type_str, extramapping, (char*)config.unit); - - records_set_report_max_buffer_size_hint ((char*)config.output_path, config.buffer_size); + + records_set_report_max_buffer_size_hint ((char*)config.output_path, config.buffer_size); /** add extra mapping : @todo api changes in reportinglib*/ records_extra_mapping((char*)config.output_path, gid, 5, extra); for (int var_idx = 0; var_idx < vars.size(); ++var_idx) { diff --git a/coreneuron/utils/reports/nrnreport.h b/coreneuron/utils/reports/nrnreport.h index 4e10cf078..c4af24f87 100644 --- a/coreneuron/utils/reports/nrnreport.h +++ b/coreneuron/utils/reports/nrnreport.h @@ -68,7 +68,7 @@ struct ReportConfiguration { double start; // start time of report double stop; // stop time of report int num_gids; // total number of gids - size_t buffer_size; // hint on buffer size used for this report + int buffer_size; // hint on buffer size used for this report std::set target; // list of gids for this report }; diff --git a/extra/CMakeLists.txt b/extra/CMakeLists.txt index 098ff33c1..8ab29311a 100644 --- a/extra/CMakeLists.txt +++ b/extra/CMakeLists.txt @@ -12,14 +12,17 @@ endif() # CMake does some magic to transform sys libs to -l. We replicate it foreach(link_lib ${CORENRN_LINK_LIBS}) get_filename_component(pth ${link_lib} DIRECTORY) - if("${pth}" MATCHES "^(/lib|/lib64|/usr/lib|/usr/lib64)$") + if(NOT pth) + string(APPEND CORENRN_LINK_DEFS " -l${link_lib}") + elseif("${pth}" MATCHES "^(/lib|/lib64|/usr/lib|/usr/lib64)$") get_filename_component(libname ${link_lib} NAME_WE) string(REGEX REPLACE "^lib" "" libname ${libname}) - set(CORENRN_LINK_DEFS "${CORENRN_LINK_DEFS} -l${libname}") + string(APPEND CORENRN_LINK_DEFS " -l${libname}") else() - set(CORENRN_LINK_DEFS "${CORENRN_LINK_DEFS} ${link_lib}") + string(APPEND CORENRN_LINK_DEFS " ${link_lib}") endif() endforeach() +#message("CORENRN_LINK_LIBS: ${CORENRN_LINK_LIBS}, CORENRN_LINK_DEFS: ${CORENRN_LINK_DEFS}") # Additional mods string(REPLACE ";" " " CORENRN_OPTMODS "${CORENRN_OPTMECH_MODS}") @@ -27,13 +30,11 @@ string(REPLACE ";" " " CORENRN_OPTMODS "${CORENRN_OPTMECH_MODS}") # PGI add --c++11;-A option for c++11 flag string(REPLACE ";" " " CXX11_STANDARD_COMPILE_OPTION "${CMAKE_CXX11_STANDARD_COMPILE_OPTION}") - # MPI path might be multiple directories if (MPI_C_INCLUDE_PATH) string(REPLACE ";" " -I" CORENRN_MPI_INCLUDES "${MPI_C_INCLUDE_PATH}") endif() - # Compiler flags depending on BUILD_TYPE shared as BUILD_TYPE__FLAGS string(TOUPPER "${CMAKE_BUILD_TYPE}" _BUILD_TYPE) set(BUILD_TYPE_C_FLAGS "${CMAKE_C_FLAGS_${_BUILD_TYPE}}") diff --git a/extra/nrnivmodl-core b/extra/nrnivmodl-core index d4c64d6d9..d5fbf7dce 100755 --- a/extra/nrnivmodl-core +++ b/extra/nrnivmodl-core @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash # ----------------------------------------------------------------------------- # nrnivmodl-core uses make to compile additonal mod files for coreneuron # Copyright 2019 Blue Brain Project @@ -8,8 +8,10 @@ set -e APP_NAME=$(basename $0) _PARENT="$(dirname $BASH_SOURCE)/.." ROOTDIR=$(perl -e "use Cwd 'abs_path'; print abs_path('$_PARENT')") +MAKE_OPTIONS="MECH_NAME MECH_VERSION OUTPUT INCFLAGS LINKFLAGS MODS_PATH OPTMODS VERBOSE" +PARALLELISM=4 -while getopts "n:v:o:i:l:ch" OPT; do +while getopts "n:v:o:i:l:p:chV" OPT; do case "$OPT" in n) params_MECH_NAME="$OPTARG";; @@ -23,6 +25,10 @@ while getopts "n:v:o:i:l:ch" OPT; do params_LINKFLAGS="$OPTARG";; c) params_OPTMODS="";; + V) + params_VERBOSE=1;; + p) + PARALLELISM="$OPTARG";; h) echo "$APP_NAME [options, ...] [mods_path]" echo "Options:" @@ -31,8 +37,10 @@ while getopts "n:v:o:i:l:ch" OPT; do echo " -o Set the output dir (default: -core)" echo " -i Definitions passed to the compiler, typically '-I dir..'" echo " -l Definitions passed to the linker, typically '-Lx -lylib..'" - echo " -c (clean) Don't use any ADDITIONAL mod built-into coreneuron." + echo " -c Clean: Don't use any ADDITIONAL mod built-into coreneuron." echo " By default this only contains halfgap.mod" + echo " -V Verbose: show commands executed by make" + echo " -p Make parallelism. Default: 4" exit 0;; ?) exit 1;; @@ -52,14 +60,25 @@ params_MODS_PATH=$1 make_params=() -for param in MECH_NAME MECH_VERSION OUTPUT INCFLAGS LINKFLAGS MODS_PATH OPTMODS; do +for param in $MAKE_OPTIONS; do var="params_${param}" [ "${!var+x}" ] && make_params+=("$param=${!var}") done # warn if no mod files provided ls "${params_MODS_PATH:-.}"/*.mod || echo "Warning: No mods found!" +( + set -x + make -j$PARALLELISM -f "${ROOTDIR}/share/coreneuron/nrnivmodl_core_makefile" "${make_params[@]}" +) +# Create a little script to call make install (relinks w right RPATH) +echo "#!/bin/bash +set -e +[ \$# -eq 1 ] || { echo 'Required install destination. Syntax: ' \$(basename \$0) ''; false; } set -x +make -f \"${ROOTDIR}/share/coreneuron/nrnivmodl_core_makefile\" ${make_params[@]} DESTDIR=\$1 install +" > nrnivmech_install.sh +chmod 755 nrnivmech_install.sh -make -j4 -f "${ROOTDIR}/share/coreneuron/nrnivmodl_core_makefile" "${make_params[@]}" +echo "mods built successfully. Install script written to nrnivmech_install.sh" diff --git a/extra/nrnivmodl_core_makefile.in b/extra/nrnivmodl_core_makefile.in index 47575d457..4f502faf1 100644 --- a/extra/nrnivmodl_core_makefile.in +++ b/extra/nrnivmodl_core_makefile.in @@ -9,29 +9,26 @@ MECH_VERSION = 0.0 MODS_PATH = . OUTPUT = @CMAKE_HOST_SYSTEM_PROCESSOR@ OPTMODS = @CORENRN_OPTMODS@ +DESTDIR = -bindir = @CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_BINDIR@ -libdir = @CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBDIR@ -incdir = @CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_INCLUDEDIR@ -datadir= @CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_DATADIR@/coreneuron -datadir_mod2c = @CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_DATADIR@/mod2c +# Coreneuron dirs +bindir := @CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_BINDIR@ +libdir := @CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBDIR@ +incdir := @CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_INCLUDEDIR@ +datadir:= @CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_DATADIR@/coreneuron +datadir_mod2c := @CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_DATADIR@/mod2c # Additional variables set in CMAKE usable here -# - @CORENRN_COMPILE_DEFS@ -# - @CORENRN_LINK_DEFS@ - +# - @CORENRN_COMPILE_DEFS +# - @CORENRN_LINK_DEFS LDFLAGS = $(LINKFLAGS) @CORENRN_LINK_DEFS@ CORENRNLIB_FLAGS = -L$(libdir) -lcoreneuron +OS_NAME := $(shell uname) # We rebuild the include dirs since a lot of stuff changes place INCLUDES = $(INCFLAGS) -I$(incdir) -I$(incdir)/coreneuron/utils/randoms -ifneq (@CORENRN_MPI_INCLUDES@,) - INCLUDES += -I@CORENRN_MPI_INCLUDES@ -endif -ifneq (@reportinglib_INCLUDE_DIR@,) - INCLUDES += -I@reportinglib_INCLUDE_DIR@ -endif - +INCLUDES += $(if @MPI_C_INCLUDE_PATH@, -I$(subst ;, -I,@MPI_C_INCLUDE_PATH@),) +INCLUDES += $(if @reportinglib_INCLUDE_DIR@, -I$(subst ;, -I,@reportinglib_INCLUDE_DIR@),) CC = @CMAKE_C_COMPILER@ CXX = @CMAKE_CXX_COMPILER@ @@ -43,18 +40,18 @@ CXXCOMPILE = $(CXX) $(CXXFLAGS) @CORENRN_COMPILE_DEFS@ $(INCLUDES) CXX_LINK_EXE = $(CXX) $(CXXFLAGS) @CMAKE_EXE_LINKER_FLAGS@ CXX_LINK_SHARED = $(CXX) $(CXXFLAGS) @CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS@ @CMAKE_SHARED_LIBRARY_CXX_FLAGS@ @CMAKE_SHARED_LINKER_FLAGS@ - -MODC_DIR = $(OUTPUT)/modc_core -OBJS_DIR = $(OUTPUT)/build_core +# File path config (internal) +MODC_DIR = $(OUTPUT)/core/mod2c +OBJS_DIR = $(OUTPUT)/core/build mod_files = $(sort $(notdir $(wildcard $(MODS_PATH)/*.mod))) -mod_names = $(mod_files:.mod=) +mod_names = $(mod_files:.mod=) $(OPTMODS:.mod=) modc_files = $(addprefix $(MODC_DIR)/,$(addsuffix .cpp,$(mod_names))) mod_objs = $(addprefix $(OBJS_DIR)/,$(addsuffix .o,$(mod_names))) kinderiv_h = $(MODC_DIR)/_kinderiv.h mod_func_o = $(OBJS_DIR)/_mod_func.o mod_func_c = $(MODC_DIR)/_mod_func.cpp -dimplic_src= $(datadir)/scopmath_core/dimplic.cpp +dimplic_src= $(datadir)/dimplic.cpp dimplic_c = $(MODC_DIR)/_dimplic.cpp dimplic_o = $(OBJS_DIR)/_dimplic.o @@ -63,55 +60,81 @@ LIB_SUFFIX_ = $(if $(MECH_NAME),_$(MECH_NAME),) coremech_libname = corenrnmech$(LIB_SUFFIX_)-$(MECH_VERSION) coremech_lib = $(OUTPUT)/lib$(coremech_libname)@CMAKE_SHARED_LIBRARY_SUFFIX@ +# If no DESTDIR (we are probably just building) we use $ORIGIN (@loader_path in OSX) +_ORIGIN := $(if $(filter Darwin,$(OS_NAME)),@loader_path,$$ORIGIN) +DESTDIR_RPATH = $(if $(DESTDIR),$(DESTDIR)/lib,$(_ORIGIN)) + +C_RESET := \033[0m +C_GREEN := \033[32m +ECHO := $(if $(filter Darwin,$(OS_NAME)),echo,echo -e) + # ======== MAIN BUILD RULES ============ # Take the main and link with nrnmech. -# RPATH is set for ORIGIN and coreneuron lib +# RPATH is set for DESTDIR_RPATH and coreneuron lib $(special): $(coremech_lib) - $(CXX_LINK_EXE) $(libdir)/libcoreneuron_main.a -o $(special) -L $(OUTPUT) -l$(coremech_libname) \ - $(CORENRNLIB_FLAGS) -Wl,-rpath,'$$ORIGIN' -Wl,-rpath,$(libdir) $(LDFLAGS) + @$(ECHO) " => $(C_GREEN)LINKING$(C_RESET) executable $(special) " + $(CXX_LINK_EXE) -I $(incdir) $(datadir)/coreneuron.cpp -o $(special) \ + -L $(OUTPUT) -l$(coremech_libname) $(CORENRNLIB_FLAGS) -Wl,-rpath,'$(DESTDIR_RPATH)' -Wl,-rpath,$(libdir) $(LDFLAGS) $(coremech_lib): $(mod_func_o) $(dimplic_o) $(mod_objs) - @echo "#BUILDING lib $(coremech_lib) from Mod files $(mod_files)" - $(CXX_LINK_SHARED) -o ${coremech_lib} \ - $(mod_func_o) $(dimplic_o) $(mod_objs) $(CORENRNLIB_FLAGS) $(LDFLAGS) + @$(ECHO) " => $(C_GREEN)LINKING$(C_RESET) library $(coremech_lib) Mod files: $(mod_files) (+ $(OPTMODS))" + $(CXX_LINK_SHARED) -I $(incdir) -DADDITIONAL_MECHS $(datadir)/enginemech.cpp -o ${coremech_lib} \ + $(mod_func_o) $(dimplic_o) $(mod_objs) $(datadir)/libscopmath.a $(CORENRNLIB_FLAGS) -Wl,-rpath,$(libdir) $(LDFLAGS) # Generic build cpp->o. Need PIC for shared lib -$(OBJS_DIR)/%.o: $(MODC_DIR)/%.cpp $(kinderiv_h) +$(OBJS_DIR)/%.o: $(MODC_DIR)/%.cpp $(kinderiv_h) | $(OBJS_DIR) + @$(ECHO) " -> $(C_GREEN)Compiling$(C_RESET) $<" $(CXXCOMPILE) @CMAKE_CXX_COMPILE_OPTIONS_PIC@ -c $< -o $@ -$(MODC_DIR)/%.cpp: $(MODS_PATH)/%.mod | $(OUTPUT) +# Build cpp files with mod2c +$(MODC_DIR)/%.cpp: $(MODS_PATH)/%.mod | $(MODC_DIR) + @$(ECHO) " -> $(C_GREEN)MOD2C$(C_RESET) $<" MODLUNIT=$(datadir_mod2c)/nrnunits.lib \ $(bindir)/mod2c_core $< -o $(MODC_DIR)/ +# If .mod doesnt exist attempt from previously built opt mods in shared/ +$(MODC_DIR)/%.cpp: $(datadir_mod2c)/%.cpp | $(MODC_DIR) + cp $< $@ + # Mod registration. Compiled by generic rule. Dont overwrite if not changed -$(mod_func_c): build_always | $(OUTPUT) +$(mod_func_c): build_always | $(MODC_DIR) + @$(ECHO) " -> $(C_GREEN)Generating$(C_RESET) $(mod_func_c)" perl $(datadir)/mod_func.c.pl $(OPTMODS) $(mod_files) > $(mod_func_c).tmp diff -q $(mod_func_c).tmp $(mod_func_c) || echo "Replacing mod_func.c" && mv $(mod_func_c).tmp $(mod_func_c) # Header to avoid function callbacks using function pointers # Move all mods to temp and bring back only those required -$(kinderiv_h): $(modc_files) build_always | $(OUTPUT) +$(kinderiv_h): $(modc_files) build_always | $(MODC_DIR) + @$(ECHO) " -> $(C_GREEN)Generating$(C_RESET) $(kinderiv_h)" cd $(MODC_DIR) && mkdir -p _tmp && mv [^_]*.cpp _tmp/ && \ mv $(addprefix _tmp/,$(notdir $(modc_files))) ./ || true rm -rf $(MODC_DIR)/_tmp cd $(MODC_DIR) && python $(datadir)/kinderiv.py -$(dimplic_c): $(dimplic_src) | $(OUTPUT) +$(dimplic_c): $(dimplic_src) | $(MODC_DIR) cp $(dimplic_src) $(dimplic_c) +install: $(special) $(coremech_lib) + install -d $(DESTDIR)/bin $(DESTDIR)/lib + install $(coremech_lib) $(DESTDIR)/lib + install $(special) $(DESTDIR)/bin + + # == INIT == -$(OUTPUT): - mkdir -p $(OUTPUT) +$(MODC_DIR): mkdir -p $(MODC_DIR) +$(OBJS_DIR): mkdir -p $(OBJS_DIR) .PHONY: build_always + +$(VERBOSE).SILENT: