Skip to content
Snippets Groups Projects
  1. Mar 31, 2017
    • Sam Yates's avatar
      Add more general indirect access view. (#216) · ca328a21
      Sam Yates authored
      * Implement `indirect_view` for indexed access via `transform_view`.
      * Extend `transform_iterator` to permit non-const access to reference-returning functor results.
      * Replace use of `indexed_view` with `indirect_view`.
      * Fix missing cpu target for vectorized modcc outputs.
      ca328a21
  2. Mar 20, 2017
    • Vasileios Karakasis's avatar
      modcc: AVX512 vectorisation backend (#154) · c55d9d66
      Vasileios Karakasis authored
      Basic features:
      
      * Compile with -t avx512
      * Automatically set up by CMake if USE_OPTIMIZED_KERNELS is on and VECTORIZE_TARGET is set to KNL 
      * Generic SIMD printer that contacts a SIMD backend for emitting the actual SIMD intrinsics
      
      Note: compilation for the avx512 target requires the Intel compiler. 
      c55d9d66
  3. Mar 15, 2017
    • Sam Yates's avatar
      Allow explicit make of GPU mechanisms. (#192) · 195befaa
      Sam Yates authored
      When NMC_WITH_CUDA is off, still allow the generation
      of CUDA mechanisms with modcc by exposing the
      `build_all_gpu_mods` target; this can be performed
      independently of the presence (or otherwise) of a
      CUDA development environment.
      
      This eases development of GPU-related modcc tasks,
      as preliminary work can be performed and checked on
      machines without a CUDA environment.
      195befaa
  4. Mar 05, 2017
    • Sam Yates's avatar
      Add linear kinetic schemes to modcc. (#145) · 5846f90b
      Sam Yates authored
      Incorporate symbolic GE code from prototype (with some simplifications) in msparse.hpp, symge.hpp and symge.cpp, together with unit tests.
      
      Add two kinetic scheme test cases for validation: test_kin1 (simple exponential scheme) and test_kinlva (combination of exponential gate and a three-species kinetic scheme, modelling a low voltage-activated Calcium channel from Wang, X. J. et al., J. Neurophys. 1991).
      
      Adapt numeric HH validation data generation to LVA Ca channel, with explicit stopping at stimulus discontinuities.
      
      Add two new validation tests based on above: kinetic.kin1_numeric_ref and kinetic.kinlva_numeric_ref (multicore backend only).
      
      Introduce a BlockRewriterBase visitor base class, as an aid for visitors that transform/rewrite procedure bodies; refactor KineticRewriter over this class.
      
      Introduce common error_stack mixin class for common functionality across Module and the various procedure rewriters.
      
      Implement visitors and public-facing convenience wrappers in symdiff.hpp and symdiff.cpp:
      
      involves_identifer for testing if an expression contains given identifiers.
      constant_simplify for constant folding with removal of trivial terms arising from a NumberExpression of zero or one.
      expr_value to extract the numerical value of a NumberExpression, or NaN othereise.
      is_zero to test if an expression is numerically zero.
      symbolic_pdiff to perform symbolic partial differentiation; this adds a new (not parseable) expression subclass to represent opaque partial differential terms.
      substitute to substitute identifiers for other expressions within an expression.
      linear_test for linearity, diagonality and homogeneity testing (this is probably redundant, given ExpressionClassifier already exists).
      Simplify unnecessary uses of make_unique with Vistor subclasses.
      
      Make SOLVE statement rewriting more generic, through the use of solve-rewriter visitors CnexpSolverVisitor, SparseSolverVisitor, and DirectSolverVisitor; implementations in solvers.hpp and solvers.cpp. Supports multiple SOLVE statements for independent subsets of state variables with the BREAKPOINT block.
      
      Add block rewriter for the removal of unused local variables, with convenience wrapper remove_unused_locals.
      
      Generalize is_in utility in modccutil.hpp.
      
      Simplify expression comparison in modcc unit tests with EXPECT_EXPR_EQ macro added to tests/modcc/test.hpp, that operates by comparing expression text representations.
      
      Simplify and consolidate verbose printing in modcc unit tests with verbose_print function that tests the global verbose flag and handles expression_ptr and similar which have to_string methods.
      5846f90b
  5. Jan 12, 2017
    • John Biddiscombe's avatar
      CMake fixes (#137) · 71aa4b18
      John Biddiscombe authored
      * Fix CMakeLists to handle build as a subproject
      
      When several CMake generated projects are build together, it is common
      practice to have a 'superproject' CMakeLists that uses
        add_subdir(proj1)
        add_subdir(proj2)
        ...
      where each subproject is a self contained CMake based project
      (Example proj1=HPX, proj2=nestmc, proj3=another, ...)
      
      CMAKE_SOURCE_DIR always points to the top level directory which
      is the superproject dir in this case, whereas PROJECT_SOURCE_DIR
      always points to the root of the current project() in the CMakeLists
      so one shouod use PROJECT_SOURCE_DIR as this gets the relative paths
      correct.
      
      * Add option to turn off auto generation from *.mod files
      
      * Fix #134 : Change CMake WITH_OPTION to NMC_WITH_OPTION, compiler #define to NMC_HAVE_OPTION
      
      1) The user may select an option by saying NMC_WITH_XXX
      
      2) This may trigger CMake to use find_package(...) or setup some
      other variables. CMake can then set variable NMC_HAVE_XXX and add a
      what has actually been used.
      
      3) Code should use #ifdef NMC_HAVE_XXX to check for a feature
      
      Old CMake/define      New CMake                 Compiler #define
      ----------------      ---------                 ----------------
      THREADING_MODEL       NMC_THREAD_MODEL
          WITH_TBB          NMC_WITH_TBB              NMC_HAVE_TBB
          WITH_OMP          NMC_WITH_OMP              NMC_HAVE_OMP
          WITH_SERIAL       NMC_WITH_SERiAL           NMC_HAVE_SERIAL
      
      WITH_MPI              NMC_WITH_MPI              NMC_HAVE_MPI
      WITH_CUDA             NMC_WITH_CUDA             NMC_HAVE_CUDA
      WITH_GPU                                        NMC_HAVE_GPU
      WITH_ASSERTIONS       NMC_WITH_ASSERTIONS       NMC_HAVE_ASSERTIONS
      WITH_TRACE            NMC_WITH_TRACE            NMC_HAVE_TRACE
      WITH_PROFILING        NMC_WITH_PROFILING        NMC_HAVE_PROFILING
      
      Other user visible CMake vars
      -----------------------------
      VECTORIZE_TARGET            -> NMC_VECTORIZE_TARGET
      USE_OPTIIZED_KERNELS        -> NMC_USE_OPTIIZED_KERNELS
      BUILD_VALIDATION_DATA       -> NMC_BUILD_VALIDATION_DATA
      BUILD_JULIA_VALIDATION_DATA -> NMC_BUILD_JULIA_VALIDATION_DATA
      BUILD_NRN_VALIDATION_DATA   -> NMC_BUILD_NRN_VALIDATION_DATA
      VALIDATION_DATA_DIR         -> NMC_VALIDATION_DATA_DIR
      
      Variables such as NMC_THREADING_MODEL and NMC_VECTORIZE_TARGET now use
      enumerated cmake values so you can toggle between them in ccmake gui.
      SYSTEM_TYPE_CRAY/BGQ        -> NMC_SYSTEM_TYPE (Generic/Cray/BGQ)
      
      * Use generator expression for modcc path
      
      Some IDE's (like Xcode for example), override the CMake binary paths
      and add /Debug or /Release etc so rules that have hard coded paths
      to binaries will fail.
      71aa4b18
  6. Dec 20, 2016
    • Vasileios Karakasis's avatar
      Feature/mechanisms unit tests (#96) · fc7e2785
      Vasileios Karakasis authored and Sam Yates's avatar Sam Yates committed
      These tests are intended to test the sanity of the `modcc` generated code for the individual mechanisms. The don't have any physical background. Potentially optimized CPU-targeted mechanisms generated in the build are compared with unoptimized mechanisms generated from the reference modules.
      
      * Add generic unit tests for individual mechanisms.
      * Make unit tests exercise potential problems with aliased indexes (point processes).
      * Ensure unit tests correspond to multiple low level vector operations.
      * Ensure unit tests run with voltage, current and indices initialized with varying values.
      * Refactor CMake code for module compilation to reduce cut-and-paste code and build complexity.
      fc7e2785
  7. Nov 15, 2016
    • Benjamin Cumming's avatar
      bugfix for missing mechanism paths · 0cc8c4c9
      Benjamin Cumming authored
      The mechansims/gpu and mechanisms/multicore paths were not being generated
      by CMake during configuration, and modcc was silently ignoring that it was
      not able to write to the nonexistant target paths.
      I have updated CMake to generate the missing gpu and multicore target paths.
      0cc8c4c9
  8. Nov 14, 2016
    • Ben Cumming's avatar
      First GPU support (#77) · 97e17b18
      Ben Cumming authored
      This PR is part of the gpu feature merge. The GPU implementation is not implemented here. Instead, we focus on refactoring of the original "multicore" back end so that it is ready for adding the GPU back end.
      
      This is a big and messy change, for which I am sorry.
      
      ## build System
      
      - A `WITH_CUDA` option has been added to the main CMakeLists. This finds the CUDA toolkit, and sets CUDA compiler flags, and will build unit tests for the gpu back end.
      - The CMakeLists that generates mechanisms with modcc has been updated to generate CUDA mechanisms.
      - the library is now named `libnestmc` instead of `libcellalgo`
      - merge the external libraries that are optionally linked againts (tbb, libunwind, etc) into a single
        `EXTERNAL_LIBRARIES` list for ease of linking
      
      ## modcc
      
      - the cprinter and cudaprinter have had small changes to generate mechanism files that are compatible with the refactored library.
      
      ## algorithms
      
      - the indexes into algorithm was "rangified". An algorithm `index_into_iterator` takes two ranges as inputs to make a range that lazily generates the index of sub into super set.
      
      ## backends
      
      - made a new path `src/backends/` for backend specific type and implementation code.
      - currently:
        - complete support for the `multicore` and `gpu` backends
        - `gpu` back end is not optimized or validated
      - the back end implementations are in `src/backends`
      - a single `backend` class, `nest::mc::{multicore,gpu}::backend`, is provides all backend specific type and implementation details fro each backend
        - storage containers
        - Hines matrix assembly for FVM method
        - Hines matrix solver
        - mechanism "factory"
      
      ## lowered fvm cells
      
      - removed `fvm_cell` because this can be modelled with an `fvm_multicell` with one cell.
      - refactored to use backend type and implementation from `fvm_policy`
      - use `std::vector` instead of containers in `nest::mc::memory::` where possible when building cells.
      
      ## memory library
      
      Refactor the "memory" library, making it much simpler and better integrated into the rest of the application. However, it is still far from perfect. The `Coordinator` approach needs to be improved, most likely by putting target-specific wisdom into pointers (which could obviate the need for a `const_array_view` type.
      1. renaming and moving
         - move from `vector/` to `src/memory`
         - move into the `nest::mc` namespace, i.e. all types and functions are now in `nest::mc::memory`
         - change from camel case nameing scheme to NestMC style naming.
      2. simplification
         - remove the CRTP cruft that was used to make operator overloading work for operations like copying from one range into another, and filling a range with a constant value. These have been replaced with `memory::fill()` and `memory::copy()` helper functions. This simplified the code _a lot_, and makes code clearer in user land.
         
         ```
         // before
         vec(0, 5) = other;
         // now
         memory::copy(other, vec(0, 5));
         ```
         - add some wrappers in `src/memory/wrappers.hpp` that help with making views. These are particularly useful for passing `std::vector` through interfaces that expect a view.
      
      ## debug backtraces
      
      Added stack traces for debugging.
      - support for OSX and Linux via libunwind
      - backtraces can be generated manually `nest::mc::util::backtrace().print()`
        - creates a new file and dumps trace into file
        - prints message to `stderr` with file name and instructions on how to analyse
      - backtraces are also automatically generated when an assertion `EXPECTS` statement fails
      - a python script in `scripts/print_backtrace` pretty prints the output with file name, line number and demangled symbols
      
      ## util simplification and consolidation
      
      The `src/util.hpp` file was removed
      - much of its contents were dead code and just removed
      - useful components like `pprintf` and `make_unique` were moved into the `src/utils` path in standalone files
      There was a lot of overlap between functionality provided in `src/memory/util.hpp` and existing functions/types in the `nest::mc::util` namespace. The `memory` implementations were removed, and their `nest::mc::util` counterparts used. There is still some work remaining, namely moving the rest of the `src/memory/util.hpp` into `src/util/...`
      97e17b18
  9. Oct 04, 2016
  10. Aug 25, 2016
    • Benjamin Cumming's avatar
      WIP communication testing · 8314d37c
      Benjamin Cumming authored
      * fix compile time error in src/model.hpp
      * add mpi_listener type for sensible output and error reporting
        when using MPI with Google Test.
      * add stub for communicator unit testing
      8314d37c
  11. Aug 24, 2016
    • Benjamin Cumming's avatar
      improve support for vectorization in CMake · 5271e619
      Benjamin Cumming authored
      * the user can specify one of {none,AVX,AVX2,KNL} as
        targets for vectorization
      * if modcc is available in PATH it will be used, which
        makes cross compilation easier
      * a new flag USE_OPTIMIZED_KERNELS can be set to
        generate optimized kernels from the modcc compiler
        (equivalent to adding -O flag to modcc)
      5271e619
  12. Aug 16, 2016
  13. Aug 05, 2016
  14. Jul 14, 2016
  15. Jun 08, 2016
    • Sam Yates's avatar
      Remove debug status message · dea7dac1
      Sam Yates authored
      dea7dac1
    • Sam Yates's avatar
      Use externalproject_add to manage mod->hpp depenedencies. · 4967bf30
      Sam Yates authored
      Builds modcc from modparser as an external project;
      executable will reside under BUILD/external/bin where
      BUILD is the CMake build directory.
      
      CMake hackery (see 'build_all_mods' target) should generate
      required module .hpp files from .mod files before the
      cellalgo library is built, if the header files are
      missing or out of date.
      
      This should also suffice for performing out-of-source
      builds.
      4967bf30