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

Commit 50e92ca

Browse files
committed
Various CMake changes to improve GPU build
- CORENRN_NMODL_FLAGS set automatically from CMake - PGI flags added via CMake : inlining, diagnostics and language compliant flag -A removed - Cmake copy set to new to avoid warning from find_cuda - nrnivmodl_core_makefile.in to build libcorenrnmech static library - tests were not run, fix cmake
1 parent 198f4a4 commit 50e92ca

File tree

6 files changed

+61
-30
lines changed

6 files changed

+61
-30
lines changed

CMake/OpenAccHelper.cmake

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,38 @@
55
# =============================================================================
66

77
if(CORENRN_ENABLE_GPU)
8+
89
set(COMPILE_LIBRARY_TYPE "STATIC")
10+
911
if(CORENRN_ENABLE_CUDA_UNIFIED_MEMORY)
1012
add_definitions(-DUNIFIED_MEMORY)
1113
endif()
14+
15+
if(NOT CUDA_HOST_COMPILER)
16+
find_program(GCC_BIN gcc)
17+
set(CUDA_HOST_COMPILER ${GCC_BIN} CACHE FILEPATH "" FORCE)
18+
endif()
19+
1220
if(${CMAKE_C_COMPILER_ID} STREQUAL "PGI")
1321
add_definitions(-DPG_ACC_BUGS)
14-
set(ACC_FLAGS "-acc -Minline=size:200,levels:10")
22+
set(ACC_FLAGS "-acc")
23+
set(PGI_DIAG_FLAGS "--diag_suppress 177")
24+
set(PGI_INLINE_FLAGS "-Minline=size:200,levels:10")
1525
set(CMAKE_C_FLAGS "${ACC_FLAGS} ${CMAKE_C_FLAGS}")
16-
set(CMAKE_CXX_FLAGS "${ACC_FLAGS} ${CMAKE_CXX_FLAGS}")
26+
set(CMAKE_CXX_FLAGS "${ACC_FLAGS} ${CMAKE_CXX_FLAGS} ${PGI_DIAG_FLAGS}")
27+
set(CMAKE_CXX11_STANDARD_COMPILE_OPTION --c++11)
28+
set(CMAKE_CXX14_STANDARD_COMPILE_OPTION --c++14)
1729
else()
1830
message(WARNING "Non-PGI compiler : make sure to add required compiler flags to enable OpenACC")
1931
endif()
2032

33+
if(POLICY CMP0074)
34+
cmake_policy(SET CMP0074 NEW)
35+
endif()
2136
find_package(CUDA 5.0 REQUIRED)
2237
set(CUDA_SEPARABLE_COMPILATION ON)
38+
set(CUDA_PROPAGATE_HOST_FLAGS OFF)
39+
2340
add_definitions(-DCUDA_PROFILING)
2441
else(CORENRN_ENABLE_GPU)
2542
# OpenACC pragmas are not guarded, disable all unknown pragm warnings

CMakeLists.txt

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,11 @@ if(CORENRN_ENABLE_NMODL)
192192
set(CORENRN_NMODL_INCLUDE ${CMAKE_BINARY_DIR}/include)
193193
endif()
194194
include_directories(${CORENRN_NMODL_INCLUDE})
195-
set(CORENRN_NMODL_FLAGS "" CACHE STRING "Extra NMODL options such as passes")
195+
if(CORENRN_ENABLE_GPU)
196+
set(CORENRN_NMODL_FLAGS "acc --oacc" CACHE STRING "Extra NMODL options such as passes")
197+
else()
198+
set(CORENRN_NMODL_FLAGS "" CACHE STRING "Extra NMODL options such as passes")
199+
endif()
196200
separate_arguments(NMODL_EXTRA_FLAGS_LIST UNIX_COMMAND "${CORENRN_NMODL_FLAGS}")
197201
else()
198202
include(AddMod2cSubmodule)
@@ -236,6 +240,15 @@ endif()
236240
install(FILES CMake/coreneuron-config.cmake DESTINATION share/cmake)
237241
install(EXPORT coreneuron DESTINATION share/cmake)
238242

243+
# just for printing the compiler flags in the build status
244+
string(TOUPPER ${CMAKE_BUILD_TYPE} BUILD_TYPE_UPPER)
245+
if(BUILD_TYPE_UPPER MATCHES "CUSTOM")
246+
set(COMPILER_FLAGS "${CMAKE_CXX_FLAGS}")
247+
else()
248+
set(COMPILER_FLAGS "${CMAKE_CXX_FLAGS_${BUILD_TYPE_UPPER}}")
249+
endif()
250+
251+
239252
# =============================================================================
240253
# Build status
241254
# =============================================================================
@@ -253,6 +266,7 @@ if(cmake_generator_tolower MATCHES "makefile")
253266
message(STATUS " Build option | Status")
254267
message(STATUS "--------------------+--------------------------------------------------------")
255268

269+
message(STATUS "COMPILE FLAGS | ${COMPILER_FLAGS} ${CMAKE_CXX_FLAGS}")
256270
message(STATUS "MPI | ${CORENRN_ENABLE_MPI}")
257271
if(CORENRN_ENABLE_MPI)
258272
message(STATUS " INC | ${MPI_C_INCLUDE_PATH}")
@@ -262,11 +276,16 @@ if(cmake_generator_tolower MATCHES "makefile")
262276
if(CORENRN_ENABLE_NMODL)
263277
message(STATUS " PATH | ${CORENRN_NMODL_BINARY}")
264278
message(STATUS " ISPC | ${CORENRN_ENABLE_ISPC}")
279+
message(STATUS " FLAGS | ${CORENRN_NMODL_FLAGS}")
265280
else()
266281
message(STATUS "MOD2C | ${MOD2C_PROJ}")
267282
endif()
268283
message(STATUS "GPU Support | ${CORENRN_ENABLE_GPU}")
269-
message(STATUS "CUDA Unified Memory | ${CORENRN_ENABLE_CUDA_UNIFIED_MEMORY}")
284+
if(CORENRN_ENABLE_GPU)
285+
message(STATUS " CUDA | ${CUDA_TOOLKIT_ROOT_DIR}")
286+
message(STATUS " Unified Memory | ${CORENRN_ENABLE_CUDA_UNIFIED_MEMORY}")
287+
message(STATUS " HOST COMPILER | ${CUDA_HOST_COMPILER}")
288+
endif()
270289
message(STATUS "Auto Timeout | ${CORENRN_ENABLE_TIMEOUT}")
271290
message(STATUS "Wrap exp() | ${CORENRN_ENABLE_HOC_EXP}")
272291
message(STATUS "SplayTree Queue | ${CORENRN_ENABLE_SPLAYTREE_QUEUING}")

README.md

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -80,12 +80,7 @@ module load pgi/18.4 cuda/9.0.176 cmake intel-mpi # change pgi, cuda and mpi mod
8080
export CC=mpicc
8181
export CXX=mpicxx
8282

83-
cmake .. -DCMAKE_C_FLAGS:STRING="-O2" \
84-
-DCMAKE_CXX_FLAGS:STRING="-O2" \
85-
-DCOMPILE_LIBRARY_TYPE=STATIC \
86-
-DCUDA_HOST_COMPILER=`which gcc` \
87-
-DCUDA_PROPAGATE_HOST_FLAGS=OFF \
88-
-DCORENRN_ENABLE_GPU=ON
83+
cmake .. -DCORENRN_ENABLE_GPU=ON
8984
```
9085

9186
Note that the CUDA Toolkit version should be compatible with PGI compiler installed on your system. Otherwise you have to add extra C/C++ flags. For example, if we are using CUDA Toolkit 9.0 installation but PGI default target is CUDA 8.0 then we have to add :

extra/nrnivmodl_core_makefile.in

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ INCLUDES += $(if @reportinglib_INCLUDE_DIR@, -I$(subst ;, -I,@reportinglib_INCLU
4040
CC = @CMAKE_C_COMPILER@
4141
CXX = @CMAKE_CXX_COMPILER@
4242
CFLAGS = @BUILD_TYPE_C_FLAGS@ @CMAKE_C_FLAGS@
43-
CXXFLAGS = @BUILD_TYPE_CXX_FLAGS@ @CMAKE_CXX_FLAGS@ @CXX14_STANDARD_COMPILE_OPTION@
43+
CXXFLAGS = @BUILD_TYPE_CXX_FLAGS@ @CMAKE_CXX_FLAGS@ @CXX14_STANDARD_COMPILE_OPTION@ @PGI_INLINE_FLAGS@
4444

4545
COMPILE = $(CC) $(CFLAGS) @CORENRN_COMPILE_DEFS@ $(INCLUDES)
4646
CXXCOMPILE = $(CXX) $(CXXFLAGS) @CORENRN_COMPILE_DEFS@ $(INCLUDES)
@@ -96,7 +96,12 @@ dimplic_o = $(OBJS_DIR)/_dimplic.o
9696

9797
special = $(OUTPUT)/special-core
9898
coremech_libname = corenrnmech$(if $(MECH_NAME),_$(MECH_NAME),)
99-
coremech_lib = $(OUTPUT)/lib$(coremech_libname)@CMAKE_SHARED_LIBRARY_SUFFIX@
99+
ifeq (@COMPILE_LIBRARY_TYPE@, STATIC)
100+
library_suffix = @CMAKE_STATIC_LIBRARY_SUFFIX@
101+
else
102+
library_suffix = @CMAKE_SHARED_LIBRARY_SUFFIX@
103+
endif
104+
coremech_lib = $(OUTPUT)/lib$(coremech_libname)$(library_suffix)
100105

101106
# If no DESTDIR (we are probably just building) we use $ORIGIN (@loader_path in OSX)
102107
_ORIGIN := $(if $(filter Darwin,$(OS_NAME)),@loader_path,$$ORIGIN)
@@ -106,7 +111,6 @@ DESTDIR_RPATH = $(if $(DESTDIR),$(DESTDIR)/lib,$(_ORIGIN))
106111
C_RESET := \033[0m
107112
C_GREEN := \033[32m
108113

109-
110114
# ======== MAIN BUILD RULES ============
111115

112116
# Take the main and link with nrnmech.
@@ -119,9 +123,15 @@ $(special): $(coremech_lib)
119123

120124
$(coremech_lib): $(mod_func_o) $(dimplic_o) $(mod_c_objs) $(mod_ispc_objs) build_always
121125
@printf " => $(C_GREEN)LINKING$(C_RESET) library $(coremech_lib) Mod files: $(mod_files)\n"
122-
$(CXX_LINK_SHARED) $(INCFLAGS) -I $(incdir) -DADDITIONAL_MECHS $(datadir)/enginemech.cpp -o ${coremech_lib} ${_SONAME} \
123-
$(mod_func_o) $(dimplic_o) $(mod_c_objs) $(mod_ispc_objs) $(libdir)/libscopmath.a $(CORENRNLIB_FLAGS) -Wl,-rpath,$(libdir) $(LDFLAGS)
124-
(rm -f $(OUTPUT)/.libs/libcorenrnmech@CMAKE_SHARED_LIBRARY_SUFFIX@ ; mkdir -p $(OUTPUT)/.libs ; ln -s ../../${coremech_lib} $(OUTPUT)/.libs/libcorenrnmech@CMAKE_SHARED_LIBRARY_SUFFIX@)
126+
@rm -f ${coremech_lib}
127+
$(CXXCOMPILE) @CMAKE_CXX_COMPILE_OPTIONS_PIC@ -c -DADDITIONAL_MECHS $(datadir)/enginemech.cpp
128+
@if [ "@COMPILE_LIBRARY_TYPE@" = "SHARED" ]; then\
129+
$(CXX_LINK_SHARED) $(INCFLAGS) -I $(incdir) enginemech.o -o ${coremech_lib} ${_SONAME} \
130+
$(mod_func_o) $(dimplic_o) $(mod_c_objs) $(mod_ispc_objs) $(libdir)/libscopmath.a $(CORENRNLIB_FLAGS) -Wl,-rpath,$(libdir) $(LDFLAGS);\
131+
else\
132+
ar cq ${coremech_lib} enginemech.o $(mod_func_o) $(dimplic_o) $(mod_c_objs) $(mod_ispc_objs);\
133+
fi
134+
(rm -f $(OUTPUT)/.libs/libcorenrnmech$(library_suffix) ; mkdir -p $(OUTPUT)/.libs ; ln -s ../../${coremech_lib} $(OUTPUT)/.libs/libcorenrnmech$(library_suffix))
125135

126136

127137
# Generic build cpp->.o Need PIC for shared lib

tests/integration/CMakeLists.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@ set(COMMON_ARGS "--tstop 100. --celsius 6.3 --mpi")
88
set(RING_DATASET_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ring")
99
set(RING_COMMON_ARGS "--datpath ${RING_DATASET_DIR} ${COMMON_ARGS}")
1010
set(RING_GAP_COMMON_ARGS "--datpath ${CMAKE_CURRENT_SOURCE_DIR}/ring_gap ${COMMON_ARGS}")
11-
set(PERMUTE1_ARGS "--cell-permute 1 --nwarp 8")
12-
set(PERMUTE2_ARGS "--cell-permute 2 --nwarp 16")
11+
set(PERMUTE1_ARGS "--cell-permute 1")
12+
set(PERMUTE2_ARGS "--cell-permute 2")
1313
if(CORENRN_ENABLE_GPU)
1414
set(GPU_ARGS "--nwarp 8 --gpu")
1515
endif()
1616

1717
# List of tests with arguments
18-
set(TEST_CASE_ARGS
18+
set(TEST_CASES_WITH_ARGS
1919
"ring!${RING_COMMON_ARGS} ${GPU_ARGS} --outpath ${CMAKE_CURRENT_BINARY_DIR}/ring"
2020
"ring_binqueue!${RING_COMMON_ARGS} ${GPU_ARGS} --outpath ${CMAKE_CURRENT_BINARY_DIR}/ring_binqueue --binqueue"
2121
"ring_multisend!${RING_COMMON_ARGS} ${GPU_ARGS} --outpath ${CMAKE_CURRENT_BINARY_DIR}/ring_multisend --multisend"
@@ -30,7 +30,7 @@ set(TEST_CASE_ARGS
3030
"ring_gap_permute2!${RING_GAP_COMMON_ARGS} ${GPU_ARGS} --outpath ${CMAKE_CURRENT_BINARY_DIR}/ring_gap_permute2 ${PERMUTE2_ARGS}"
3131
)
3232

33-
set(NEGATIVE_TEST_CASE_ARGS "ring_different_seed!${RING_COMMON_ARGS} ${GPU_ARGS} --outpath ${CMAKE_CURRENT_BINARY_DIR}/ring_different_seed --seed 123456")
33+
set(NEGATIVE_TEST_CASES_WITH_ARGS "ring_different_seed!${RING_COMMON_ARGS} ${GPU_ARGS} --outpath ${CMAKE_CURRENT_BINARY_DIR}/ring_different_seed --seed 123456")
3434

3535
# There are no directories for permute and multisend related tests, create them and copy ref spikes
3636
foreach(data_dir "ring" "ring_gap")

tests/jenkins/install_coreneuron.sh

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,6 @@ cd $WORKSPACE/build_${CORENRN_TYPE}
2323
echo "${CORENRN_TYPE} build"
2424
if [ "${CORENRN_TYPE}" = "GPU-non-unified" ]; then
2525
cmake \
26-
-DCMAKE_C_FLAGS:STRING="-O2" \
27-
-DCMAKE_CXX_FLAGS:STRING="-O2 -D_GLIBCXX_USE_CXX11_ABI=0 -DR123_USE_SSE=0" \
28-
-DCOMPILE_LIBRARY_TYPE=STATIC \
29-
-DCUDA_HOST_COMPILER=`which gcc` \
30-
-DCUDA_PROPAGATE_HOST_FLAGS=OFF \
3126
-DCORENRN_ENABLE_GPU=ON \
3227
-DCORENRN_ENABLE_CUDA_UNIFIED_MEMORY=OFF \
3328
-DCMAKE_INSTALL_PREFIX=$WORKSPACE/install_${CORENRN_TYPE}/ \
@@ -38,11 +33,6 @@ if [ "${CORENRN_TYPE}" = "GPU-non-unified" ]; then
3833
$WORKSPACE/
3934
elif [ "${CORENRN_TYPE}" = "GPU-unified" ]; then
4035
cmake \
41-
-DCMAKE_C_FLAGS:STRING="-O2" \
42-
-DCMAKE_CXX_FLAGS:STRING="-O2 -D_GLIBCXX_USE_CXX11_ABI=0 -DR123_USE_SSE=0" \
43-
-DCOMPILE_LIBRARY_TYPE=STATIC \
44-
-DCUDA_HOST_COMPILER=`which gcc` \
45-
-DCUDA_PROPAGATE_HOST_FLAGS=OFF \
4636
-DCORENRN_ENABLE_GPU=ON \
4737
-DCORENRN_ENABLE_CUDA_UNIFIED_MEMORY=ON \
4838
-DCMAKE_INSTALL_PREFIX=$WORKSPACE/install_${CORENRN_TYPE}/ \

0 commit comments

Comments
 (0)