From 18098783e1ea3417804125b87ab21c051e48b783 Mon Sep 17 00:00:00 2001
From: Ben Cumming <louncharf@gmail.com>
Date: Mon, 15 May 2017 20:27:01 +0200
Subject: [PATCH] Fix incorrect GPU backend determination
Fixes #266.
Use CUDA to compile the `cell_group_factory` so that the CUDA back end is compiled correctly, instead of the null back end proxy.
* Added bonus: the miniapp is now compiled using host C++ compiler instead of `nvcc`.
This is a little bit hacky, because this is a stop gap until we have separate compilation of CUDA code.
---
CMakeLists.txt | 5 +++++
miniapp/CMakeLists.txt | 10 ++--------
src/CMakeLists.txt | 33 ++++++++++++++++++++++++---------
src/cell_group_factory.cu | 1 +
tests/unit/CMakeLists.txt | 6 ++----
tests/unit/test_matrix.cu | 1 +
tests/validation/CMakeLists.txt | 4 ++--
7 files changed, 37 insertions(+), 23 deletions(-)
create mode 100644 src/cell_group_factory.cu
diff --git a/CMakeLists.txt b/CMakeLists.txt
index b08a739f..be8d1dec 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -52,6 +52,11 @@ option(NMC_AUTO_RUN_MODCC_ON_CHANGES
set(EXTERNAL_LIBRARIES "")
set(EXTERNAL_INCLUDES "")
+#----------------------------------------------------------
+# list of libraries built inside NestMC
+#----------------------------------------------------------
+set(NESTMC_LIBRARIES "")
+
#----------------------------------------------------------
# Threading model selection
#----------------------------------------------------------
diff --git a/miniapp/CMakeLists.txt b/miniapp/CMakeLists.txt
index 801a48d2..c41f7c51 100644
--- a/miniapp/CMakeLists.txt
+++ b/miniapp/CMakeLists.txt
@@ -13,14 +13,9 @@ set(MINIAPP_SOURCES_CUDA
morphology_pool.cpp
)
-if(NMC_WITH_CUDA)
- cuda_add_executable(miniapp.exe ${MINIAPP_SOURCES_CUDA} ${HEADERS})
- target_link_libraries(miniapp.exe LINK_PUBLIC gpu)
-else()
- add_executable(miniapp.exe ${MINIAPP_SOURCES} ${HEADERS})
-endif()
+add_executable(miniapp.exe ${MINIAPP_SOURCES} ${HEADERS})
-target_link_libraries(miniapp.exe LINK_PUBLIC nestmc)
+target_link_libraries(miniapp.exe LINK_PUBLIC ${NESTMC_LIBRARIES})
target_link_libraries(miniapp.exe LINK_PUBLIC ${EXTERNAL_LIBRARIES})
if(NMC_WITH_MPI)
@@ -32,4 +27,3 @@ set_target_properties(miniapp.exe
PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/miniapp"
)
-
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 469086ad..badd3733 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,7 +1,7 @@
set(BASE_SOURCES
common_types_io.cpp
cell.cpp
- cell_group_factory.cpp
+ #cell_group_factory.cpp
event_binner.cpp
model.cpp
morphology.cpp
@@ -25,13 +25,18 @@ set(CUDA_SOURCES
memory/fill.cu
)
+# The cell_group_factory acts like an interface between the
+# front end and back end.
+if(NMC_WITH_CUDA)
+ set(CUDA_SOURCES ${CUDA_SOURCES} cell_group_factory.cu)
+else()
+ set(BASE_SOURCES ${BASE_SOURCES} cell_group_factory.cpp)
+endif()
if(NMC_WITH_MPI)
set(BASE_SOURCES ${BASE_SOURCES} communication/mpi.cpp)
-
elseif(NMC_WITH_DRYRUN)
set(BASE_SOURCES ${BASE_SOURCES} communication/dryrun_global_policy.cpp)
-
endif()
if(NMC_WITH_CTHREAD)
@@ -39,14 +44,24 @@ if(NMC_WITH_CTHREAD)
endif()
add_library(nestmc ${BASE_SOURCES} ${HEADERS})
-
-if (NMC_AUTO_RUN_MODCC_ON_CHANGES)
- add_dependencies(nestmc build_all_mods)
-endif()
+list(APPEND NESTMC_LIBRARIES nestmc)
if(NMC_WITH_CUDA)
cuda_add_library(gpu ${CUDA_SOURCES})
- set(NESTMC_LIBRARIES ${NESTMC_LIBRARIES} gpu)
- add_dependencies(gpu build_all_gpu_mods)
+ # FIXME
+ # The gpu library uses symbols fron nestmc, so we have to
+ # add nestmc to the end. This is a temporary hack that will
+ # go away when we have properly seperable front and back end
+ # compilation.
+ list(APPEND NESTMC_LIBRARIES gpu nestmc)
+endif()
+
+if (NMC_AUTO_RUN_MODCC_ON_CHANGES)
+ add_dependencies(nestmc build_all_mods)
+ if (NMC_WITH_CUDA)
+ add_dependencies(gpu build_all_gpu_mods)
+ endif()
endif()
+# Make changes to the NMC_LIBRARIES visible to the parent scope.
+set(NESTMC_LIBRARIES "${NESTMC_LIBRARIES}" PARENT_SCOPE)
diff --git a/src/cell_group_factory.cu b/src/cell_group_factory.cu
new file mode 100644
index 00000000..21d20e7b
--- /dev/null
+++ b/src/cell_group_factory.cu
@@ -0,0 +1 @@
+#include "cell_group_factory.cpp"
diff --git a/tests/unit/CMakeLists.txt b/tests/unit/CMakeLists.txt
index 09935997..06899d2d 100644
--- a/tests/unit/CMakeLists.txt
+++ b/tests/unit/CMakeLists.txt
@@ -89,15 +89,13 @@ endif()
target_include_directories(test.exe PRIVATE "${mech_proto_dir}/..")
if(NMC_WITH_CUDA)
- # Omit -DDATADIR for cuda target because of CMake 3.7/3.8 FindCUDA quoting bug.
-
set(TARGETS ${TARGETS} test_cuda.exe)
cuda_add_executable(test_cuda.exe ${TEST_CUDA_SOURCES} ${HEADERS})
- target_link_libraries(test_cuda.exe LINK_PUBLIC gpu)
endif()
foreach(target ${TARGETS})
- target_link_libraries(${target} LINK_PUBLIC gtest nestmc)
+ target_link_libraries(${target} LINK_PUBLIC gtest)
+ target_link_libraries(${target} LINK_PUBLIC ${NESTMC_LIBRARIES})
target_link_libraries(${target} LINK_PUBLIC ${EXTERNAL_LIBRARIES})
if(NMC_WITH_MPI)
diff --git a/tests/unit/test_matrix.cu b/tests/unit/test_matrix.cu
index dbf39f03..dac64cdf 100644
--- a/tests/unit/test_matrix.cu
+++ b/tests/unit/test_matrix.cu
@@ -1,4 +1,5 @@
#include <numeric>
+#include <random>
#include <vector>
#include "../gtest.h"
diff --git a/tests/validation/CMakeLists.txt b/tests/validation/CMakeLists.txt
index 5523c3d2..288f7ded 100644
--- a/tests/validation/CMakeLists.txt
+++ b/tests/validation/CMakeLists.txt
@@ -48,8 +48,8 @@ endif()
foreach(target ${TARGETS})
- target_link_libraries(${target} LINK_PUBLIC nestmc gtest)
-
+ target_link_libraries(${target} LINK_PUBLIC gtest)
+ target_link_libraries(${target} LINK_PUBLIC ${NESTMC_LIBRARIES})
target_link_libraries(${target} LINK_PUBLIC ${EXTERNAL_LIBRARIES})
if(NMC_WITH_MPI)
--
GitLab