Skip to content
This repository was archived by the owner on Mar 20, 2023. It is now read-only.

Commit 8fa8c48

Browse files
ferdonlinepramodk
authored andcommitted
Fixing nrnivmodl-core: Avoid redefined symbols + script startup fixes (#133)
* Fixing nrnivmodl-core: dir creation, shbang * Remove unnecessary mkdir step, create core sub-directory under x86_64 * Avoiding duplicate symbols when using nrnivmodl-core * Generating libcorenrnmech featuring solve_core() * Create an intermediate library (corenrnmech, similar to the process of nrnivmodl-core) which contains the extra mechanisms and a solve_core() launcher, besides all dependent registration/hook routines (mod_func.cpp and dimplic.cpp) * Recompile kinderiv dependencies * Install libcudacoreneuron; link missing * Set rpath on libcorenrnmech * Fix for GPU. Simplified build and fixed link flag * Fixing rpath Origin in Mac and added deploy script * Remove Wall flags from default compilation * Cleanup debug messages in GPU implementation
1 parent 1fcd9c2 commit 8fa8c48

20 files changed

+246
-125
lines changed

CMake/config/ReleaseDebugAutoFlags.cmake

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,15 @@ endif()
4747
include(CompilerFlagsHelpers)
4848

4949

50-
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_WARNING_ALL} ${CMAKE_C_OPT_NORMAL}")
51-
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_DEBUGINFO_FLAGS} ${CMAKE_C_WARNING_ALL} ${CMAKE_C_OPT_NONE} ${CMAKE_C_STACK_PROTECTION}")
52-
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_DEBUGINFO_FLAGS} ${CMAKE_C_WARNING_ALL} ${CMAKE_C_OPT_NORMAL}")
53-
set(CMAKE_C_FLAGS_FAST "${CMAKE_C_WARNING_ALL} ${CMAKE_C_OPT_FASTEST} ${CMAKE_C_LINK_TIME_OPT} ${CMAKE_C_GEN_NATIVE}")
50+
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_OPT_NORMAL}")
51+
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_DEBUGINFO_FLAGS} ${CMAKE_C_OPT_NONE} ${CMAKE_C_STACK_PROTECTION}")
52+
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_DEBUGINFO_FLAGS} ${CMAKE_C_OPT_NORMAL}")
53+
set(CMAKE_C_FLAGS_FAST " ${CMAKE_C_OPT_FASTEST} ${CMAKE_C_LINK_TIME_OPT} ${CMAKE_C_GEN_NATIVE}")
5454

5555

5656

57-
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_WARNING_ALL} ${CMAKE_CXX_OPT_NORMAL}")
58-
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_DEBUGINFO_FLAGS} ${CMAKE_CXX_WARNING_ALL} ${CMAKE_CXX_OPT_NONE} ${CMAKE_CXX_STACK_PROTECTION}")
59-
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_DEBUGINFO_FLAGS} ${CMAKE_CXX_WARNING_ALL} ${CMAKE_CXX_OPT_NORMAL}")
60-
set(CMAKE_CXX_FLAGS_FAST "${CMAKE_CXX_WARNING_ALL} ${CMAKE_CXX_OPT_FASTEST} ${CMAKE_CXX_LINK_TIME_OPT} ${CMAKE_CXX_GEN_NATIVE}")
57+
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_OPT_NORMAL}")
58+
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_DEBUGINFO_FLAGS} ${CMAKE_CXX_OPT_NONE} ${CMAKE_CXX_STACK_PROTECTION}")
59+
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_DEBUGINFO_FLAGS} ${CMAKE_CXX_OPT_NORMAL}")
60+
set(CMAKE_CXX_FLAGS_FAST " ${CMAKE_CXX_OPT_FASTEST} ${CMAKE_CXX_LINK_TIME_OPT} ${CMAKE_CXX_GEN_NATIVE}")
6161

CMake/config/SetRpath.cmake

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ IF( NOT BLUEGENE AND NOT CRAY_SYSTEM)
1414
# which point to directories outside the build tree to the install RPATH
1515
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
1616

17+
set(LIB_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}")
18+
1719
# the RPATH to be used when installing, but only if it's not a system directory
1820
LIST(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${LIB_INSTALL_DIR}" isSystemDir)
1921
IF("${isSystemDir}" STREQUAL "-1")

CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@ if(${CMAKE_C_COMPILER_ID} STREQUAL "PGI")
216216
endif()
217217

218218
if(ENABLE_OPENACC)
219+
set(COMPILE_LIBRARY_TYPE "STATIC")
219220
if(${CMAKE_C_COMPILER_ID} STREQUAL "PGI")
220221
add_definitions( -DPG_ACC_BUGS)
221222
set(ACC_FLAGS "-acc -Minline=size:200,levels:10")
@@ -232,7 +233,6 @@ if(ENABLE_OPENACC)
232233
if(ENABLE_CUDA_MODULES)
233234
find_package(CUDA 5.0)
234235
SET(CUDA_SEPARABLE_COMPILATION ON)
235-
236236
if(CUDA_FOUND)
237237
if(ENABLE_SELECTIVE_GPU_PROFILING)
238238
add_definitions( -DCUDA_PROFILING)
@@ -253,6 +253,7 @@ ELSE(ENABLE_OPENACC)
253253
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${IGNORE_UNKNOWN_PRAGMA_FLAGS}")
254254
endif(ENABLE_OPENACC)
255255

256+
256257
if(DISABLE_NRN_TIMEOUT)
257258
add_definitions("-DDISABLE_TIMEOUT")
258259
endif()

apps/CMakeLists.txt

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,21 +27,15 @@
2727

2828
include_directories(${PROJECT_SOURCE_DIR} ${PROJECT_SOURCE_DIR}/coreneuron ${CMAKE_CURRENT_SOURCE_DIR} ${PROJECT_BINARY_DIR}/coreneuron)
2929

30-
# The mechanism registration function will be always defined from extra mechanisms in test directory
31-
add_definitions(-DADDITIONAL_MECHS)
32-
33-
# LIbrary required for special
34-
add_library(coreneuron_main STATIC "coreneuron.cpp")
35-
3630
add_executable(coreneuron_exec "${CMAKE_CURRENT_SOURCE_DIR}/coreneuron.cpp")
3731

38-
set_target_properties(coreneuron_exec PROPERTIES
39-
OUTPUT_NAME "coreneuron_exec")
40-
41-
target_link_libraries(coreneuron_exec coreneuron ${MPI_C_LIBRARIES} ${MPI_CXX_LIBRARIES} ${reportinglib_LIBRARY})
32+
target_link_libraries(coreneuron_exec corenrnmech
33+
${MPI_C_LIBRARIES} ${MPI_CXX_LIBRARIES} ${reportinglib_LIBRARY})
4234

4335
install(TARGETS coreneuron_exec
4436
DESTINATION "${CMAKE_INSTALL_BINDIR}")
4537

46-
install(TARGETS coreneuron_main
47-
DESTINATION "${CMAKE_INSTALL_LIBDIR}")
38+
39+
# Install main to recompile for special-core
40+
install(FILES coreneuron.cpp
41+
DESTINATION ${CMAKE_INSTALL_DATADIR}/coreneuron)

apps/coreneuron.cpp

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,8 @@ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
2626
THE POSSIBILITY OF SUCH DAMAGE.
2727
*/
2828

29-
#include <coreneuron/engine.h>
30-
extern "C" {extern void modl_reg(void);}
29+
#include <coreneuron/enginemech.h>
3130

3231
int main(int argc, char** argv) {
33-
return solve_core(argc, argv);
32+
return solve_core(argc, argv);
3433
}
35-
36-
/// Declare an empty function if Neurodamus mechanisms are not used, otherwise register them in mechs/cfile/mod_func.c
37-
#ifndef ADDITIONAL_MECHS
38-
void modl_reg() {}
39-
#endif

coreneuron/CMakeLists.txt

Lines changed: 59 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,14 @@ include_directories(utils/randoms)
2929
include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
3030
include_directories(${MPI_INCLUDE_PATH})
3131

32-
FILE(GLOB_RECURSE coreneuron_all_headers "*.h*")
33-
FILE(GLOB_RECURSE coreneuron_all_templates "*.ipp")
34-
FILE(GLOB_RECURSE coreneuron_all_c_files "*.c*")
32+
file(GLOB_RECURSE coreneuron_all_headers "*.h*")
33+
file(GLOB_RECURSE coreneuron_all_templates "*.ipp")
3534
file(GLOB_RECURSE coreneuron_cuda_files "*.cu")
35+
file(GLOB_RECURSE coreneuron_all_c_files "nrniv/*.c*" "nrnmpi/*.c*" "nrnoc/*.c*"
36+
"nrnomp/*.c*" "utils/*.c*")
37+
set(DIMPLIC_C "mech/dimplic.cpp")
38+
file(GLOB_RECURSE scopmath_c_files "scopmath_core/*.c*")
39+
3640

3741
# Compile and include MOD files
3842

@@ -228,6 +232,7 @@ add_custom_command(OUTPUT "${KINDERIV_H}"
228232
DEPENDS ${MOD2C_OPTMECH_OUTPUTS} ${MOD2C_STDMECH_OUTPUTS} "${KINDERIV_PY}"
229233
COMMAND python "${KINDERIV_PY}"
230234
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
235+
add_custom_target(kinderiv DEPENDS "${KINDERIV_H}")
231236

232237
if (EXPORT_MECHS_FUNCTIONS)
233238
# Create C file with all "get function pointers" methods
@@ -242,7 +247,8 @@ if (EXPORT_MECHS_FUNCTIONS)
242247
endif()
243248

244249
# Add generated sources from MOD files
245-
set(GENERATED_MECH_C_FILES ${MOD_FUNC_C} ${MOD_FUNC_PTRS_C} ${MOD2C_STDMECH_OUTPUTS} ${MOD2C_OPTMECH_OUTPUTS})
250+
set(ADDITIONAL_MECH_C_FILES ${MOD_FUNC_C} ${MOD_FUNC_PTRS_C} ${DIMPLIC_C} ${MOD2C_OPTMECH_OUTPUTS})
251+
set(GENERATED_MECH_C_FILES ${ADDITIONAL_MECH_C_FILES} ${MOD2C_STDMECH_OUTPUTS})
246252

247253
# 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
248254
set(NOACC_MECH_C_FILES
@@ -261,8 +267,6 @@ if(ENABLE_OPENACC)
261267
endif()
262268
endif()
263269

264-
set(coreneuron_all_c_files ${coreneuron_all_c_files} ${GENERATED_MECH_C_FILES})
265-
266270
#to indent generated c/cpp files
267271
if(CLANG_FORMAT_FOUND)
268272
add_custom_target(formatbuild
@@ -275,8 +279,6 @@ if(CLANG_FORMAT_FOUND)
275279
endif()
276280

277281

278-
add_library(coreneuron ${COMPILE_LIBRARY_TYPE} ${coreneuron_all_headers} ${coreneuron_all_templates} ${coreneuron_all_c_files} ${KINDERIV_H})
279-
280282
set(link_cudacoreneuron)
281283
set(link_reportinglib)
282284

@@ -288,6 +290,7 @@ if(ENABLE_OPENACC AND ENABLE_CUDA_MODULES)
288290
-gencode=arch=compute_50,code=sm_50
289291
-gencode=arch=compute_52,code=sm_52
290292
-gencode=arch=compute_52,code=compute_52
293+
-Xcompiler -fPIC
291294
)
292295
set(link_cudacoreneuron cudacoreneuron)
293296
endif()
@@ -297,8 +300,20 @@ if(ENABLE_REPORTINGLIB)
297300
endif()
298301

299302

303+
304+
############################################################
305+
# Target libs
306+
############################################################
307+
308+
#
309+
# The coreneuron lib (only internal mechanisms)
310+
#
311+
add_library(coreneuron ${COMPILE_LIBRARY_TYPE} ${coreneuron_all_headers} ${coreneuron_all_templates}
312+
${coreneuron_all_c_files} ${cudacorenrn_objs} ${MOD2C_STDMECH_OUTPUTS})
313+
add_dependencies(coreneuron kinderiv)
314+
300315
target_link_libraries(coreneuron ${MPI_CXX_LIBRARIES}
301-
${link_reportinglib} ${link_cudacoreneuron} ${CUDA_LIBRARIES} )
316+
${link_reportinglib} ${link_cudacoreneuron} ${CUDA_LIBRARIES})
302317

303318
set_target_properties(coreneuron PROPERTIES
304319
VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}
@@ -315,31 +330,53 @@ set(CORENRN_LINK_LIBS ${CORENRN_LINK_LIBS} PARENT_SCOPE)
315330
set(CORENRN_OPTMECH_MODS "${MOD2C_OPTMECH_MODS}" PARENT_SCOPE)
316331

317332

318-
install(TARGETS coreneuron
333+
# The scopmath lib - should not contain dimplic
334+
add_library(scopmath STATIC ${coreneuron_all_headers} ${scopmath_c_files})
335+
set_target_properties(scopmath PROPERTIES POSITION_INDEPENDENT_CODE ON)
336+
337+
#
338+
# The "complete" lib (coreneuron + opt mechs)
339+
#
340+
set(ENGINEMECH_C "mech/enginemech.cpp")
341+
add_library(corenrnmech ${COMPILE_LIBRARY_TYPE} ${coreneuron_all_headers} ${ENGINEMECH_C} ${ADDITIONAL_MECH_C_FILES})
342+
add_dependencies(corenrnmech kinderiv)
343+
344+
# The mechanism registration function will be always defined (at least for halfgap)
345+
target_compile_definitions(corenrnmech PUBLIC -DADDITIONAL_MECHS)
346+
347+
# Public link interface (default), so that end binary links with all, even if they'r static
348+
target_link_libraries(corenrnmech scopmath coreneuron)
349+
350+
351+
#########################################################
352+
# INSTALL
353+
#########################################################
354+
355+
install(TARGETS coreneuron corenrnmech ${link_cudacoreneuron}
319356
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
320357
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
321358

322-
install(FILES "engine.h"
359+
install(FILES "engine.h" "enginemech.h"
323360
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/coreneuron)
324361

362+
install(PROGRAMS ${MOD2C_BINARY}
363+
DESTINATION ${CMAKE_INSTALL_BINDIR})
364+
365+
install(FILES ${MOD2C_UNITS}
366+
DESTINATION ${CMAKE_INSTALL_DATADIR}/mod2c)
367+
368+
325369
if(ENABLE_HEADER_INSTALL)
326370
install(DIRECTORY .
327371
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/coreneuron
328372
FILES_MATCHING PATTERN "*.h*" PATTERN "*.ipp")
329373

330-
install(FILES ${KINDERIV_PY}
374+
install(FILES ${KINDERIV_PY} ${MOD_FUNC_C_PL} ${DIMPLIC_C} ${ENGINEMECH_C}
331375
DESTINATION ${CMAKE_INSTALL_DATADIR}/coreneuron)
332376

333-
install(FILES ${MOD_FUNC_C_PL}
377+
install(TARGETS scopmath
334378
DESTINATION ${CMAKE_INSTALL_DATADIR}/coreneuron)
335379

336-
install(DIRECTORY "scopmath_core"
337-
DESTINATION ${CMAKE_INSTALL_DATADIR}/coreneuron
338-
FILES_MATCHING PATTERN "dimplic.cpp")
380+
install(FILES ${MOD2C_OPTMECH_OUTPUTS}
381+
DESTINATION ${CMAKE_INSTALL_DATADIR}/mod2c)
339382
endif()
340-
341-
install(PROGRAMS ${MOD2C_BINARY}
342-
DESTINATION ${CMAKE_INSTALL_BINDIR})
343-
344-
install(FILES ${MOD2C_UNITS}
345-
DESTINATION ${CMAKE_INSTALL_DATADIR}/mod2c)

coreneuron/engine.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
#ifdef __cplusplus
55
extern "C" {
66
#endif
7-
extern int solve_core(int argc, char** argv);
7+
8+
extern void mk_mech_init(int argc, char** argv);
9+
extern int run_solve_core(int argc, char** argv);
10+
811
#ifdef __cplusplus
912
}
1013
#endif

coreneuron/enginemech.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#ifndef CORENEURON_ENGINEMECH_H
2+
#define CORENEURON_ENGINEMECH_H
3+
4+
#ifdef __cplusplus
5+
extern "C" {
6+
#endif
7+
8+
int solve_core(int argc, char** argv);
9+
10+
#ifdef __cplusplus
11+
}
12+
#endif
13+
14+
#endif
File renamed without changes.

coreneuron/mech/enginemech.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/// Corenrnmech is a wrapper lib providing a single solve_core function
2+
/// which initializes the solver, loads the external mechanisms and launches the simulation
3+
4+
#include <coreneuron/enginemech.h>
5+
#include <coreneuron/engine.h>
6+
7+
#ifdef ADDITIONAL_MECHS
8+
namespace coreneuron{ extern void modl_reg(); }
9+
#endif
10+
11+
int solve_core(int argc, char** argv) {
12+
13+
mk_mech_init(argc, argv);
14+
15+
#ifdef ADDITIONAL_MECHS
16+
/// Initializing additional Neurodamus mechanisms (in mod_func.c, built by mech/mod_func.c.pl)
17+
coreneuron::modl_reg();
18+
#endif
19+
20+
return run_solve_core(argc, argv);
21+
}

0 commit comments

Comments
 (0)