Skip to content
Permalink
master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time

Adding New Code to NEST

This document assumes that the reader already knows how to build NEST from source.

  • If you want to add a new library inside NEST, createa a new directory inside nest/nest-2.6.0. In my case, I created the directory nest/nest-2.6.0/nestgpu and wanted my new code to be inside the new library libnestgpu. Inside this directory, you add your new source/header files.
  • However, your code is still not part of the NEST build system. To have your code be built with NEST, you need to do few more things.
  • First, create a file named Makefile.am inside this new directory. Every source directory of NEST contains a Makefile.am file of its own. This file contains instructions for the automake tool so that it knows what to build, from which files, using which libraries, etc. For example, I had two source files: GpuDataAdapter.h`` and GpuDataAdapter.cpp`` which I wanted to be built into my new library libnestgpu. For this purpose, my ```nest/nest-2.6.0/nestgpu/Makefile.am``` file contained the following lines:
# Automake file for the GPU-port of the NEST simulation kernel library
#
# Saad Quader, January 2015
#

defs= @SLI_THREAD_DEFS@ $defs
MAKEFLAGS= @MAKE_FLAGS@

noinst_LTLIBRARIES=libnestgpu.la

libnestgpu_la_SOURCES=\
	gpu_data_adapter.h gpu_data_adapter.cpp

# do not change anything below this line ------------------------------

libnestgpu_la_CXXFLAGS= @AM_CXXFLAGS@

libnestgpu_la_LIBADD= @LIBLTDL@ @LIBADD_DL@

AM_CPPFLAGS=	-I$(top_srcdir)/libnestutil\
		-I$(top_srcdir)/librandom\
		-I$(top_srcdir)/sli\
		-I$(top_srcdir)/nestkernel\
		@INCLTDL@ @GSL_CFLAGS@ @MUSIC_INCLUDE@ @MPI_INCLUDE@
		
  • Suppose you want to use your code from any part of the original NEST code. In my case, I wanted to call GpuDataAdapter::init() from within the function neststartup() in the file nest/nest-2.6.0/nest/neststartup.cpp. For this, inside the cpp file, I added #include "gpudataadapter.h" and inside the definition of the function neststartup(), I added nest::gpu::GpuDataAdapter::init();.

  • Editing the existing source code was easy. However, how does the compiler/linker know where to find the declaration/definition of the code for the GpuDataAdapter::init() function? This is the hard part. For this, I had to modify the nest/nest-2.6.0/nest/Makefile.am file as follows:

    • I added nestgpu/libnestgpu.la to the existing definition of the variables nest_LDADD and nest_DEPENDENCIES so that the linker knows where to find the definition of my new functions.
    • I also added -I$(top_srcdir)/nestgpu to the existing value of the variable AM_CPPFLAGS so that the compiler knows where to look for the #include headers for my new code.
    • However, it turned out that the module nest/nest-2.6.0/pynest also uses the file nest/nest-2.6.0/nest/neststartup.cpp and its header. Therefore, I had to specify the nest/nest-2.6.0/nestgpu directory as an include directory in the file nest/nest-2.6.0/pynest/Makefile.am as well. However, I did not need to specify the library libnestgpu because the library pynestkernel.la was already linked to the library libnest.la which was also already linked to my library libnestgpu.la.
  • Next, you should tell the NEST build system to actually visit this subdirectory and build your code. For this, you have to edit the nest/nest-2.6.0/configure.ac.in. In particular, you need to edit two things:

    • You have to specify that you have a new source directory. You do this by editing the existing value of the variable SLI_CORE_LIBS and adding the word nestgpu in its existing list of directories.
    • You have to specify that you have a new Makefile to be created by the configure script. You do this by adding the following line: AC_CONFIG_FILES(nestgpu/Makefile) after the list of existing Makefiles. (Just search for the text AC_CONFIG_FILES) inside the file configure.ac.in.)
  • Now that we have specified that we have new code, we need to rebuild the system, by generating a new configure script using our recently modified configure.ac.in file. To do this, just run the script nest/nest-2.6.0/bootstrap.sh which would generate a new configure script.

  • Then, reconfigure NEST by typing cd /home/saad/nest/build && ../nest-2.6.0/configure ../nest-2.6.0/configure --prefix=/home/saad/venv/nest-dbg --with-mpi --with-openmp --with-debug --with-optimize=-O0.

  • Then, build NEST by running make and make install.

  • Now, when NEST runs, it does so with the modified code.