Skip to content
Snippets Groups Projects
  1. Feb 05, 2019
  2. Feb 04, 2019
    • Sam Yates's avatar
      Add fallback implementation of glob for platforms without it. (#660) · b11d2d14
      Sam Yates authored
      Implement a basic glob routine, supporting a subset of POSIX behaviour (e.g. no character classes), as a fallback for platforms such as Android which do not include it in their libc.
      
      * Add CMake configuration option `ARB_USE_POSIX_GLOB`, defaults to `ON`, that determines if the fallback implementation is used or not.
      * Extend `sup::path` functionality to add directory iterators and a couple more path manipulation routines, again following the C++17 `std::filesystem` interface.
      * Add an NFA pattern matcher `glob_basic_match` and file system `glob_basic` function; the latter is abstracted over a file system provider object, primarily for testing/mocking purposes.
      * Add unit tests for new `sup::path` functionality and for `glob_basic`.
      
      FIxes #181.
  3. Feb 01, 2019
    • Sam Yates's avatar
      Feature/expunge spike emitter (#682) · 4dc40c58
      Sam Yates authored and Benjamin Cumming's avatar Benjamin Cumming committed
      Remove `sup::spike_emitter` and replace usages in `miniapp` and `brunel-miniapp`.
      
      * Replaces instances of `spike_emitter` in `miniapp` and `brunel-miniapp` with a callback that saves spikes to a vector and which is written to a file after the simulation ends.
      * Remove unused fields from `cl_options` in `brunel-miniapp`, including spike output file components.
      * Hard code spike output path to `spikes.gdf` in `brunel-miniapp` and write saved spikes after simulation end.
      * Correctly set 'rank' in `miniapp` (used in spike output paths).
      * Read spike output options from JSON config in `miniapp` unconditionally.
      * Make line comments in `miniapp` and `brunel-miniapp` main functions a bit more consistent in
      formatting.
      
      Fixes #677.
      4dc40c58
  4. Jan 31, 2019
    • Sam Yates's avatar
      Split out 'arborenv' as an installable library from the sup library. (#679) · f4b2e034
      Sam Yates authored and Benjamin Cumming's avatar Benjamin Cumming committed
      Make a new installed library `libarborenv.a` covering a subset of the `sup` library functionality, with corresponding installed CMake target `arbor::arborenv`.
      
      * Move NVML or CUDA 10 API decision for GPU UUID discovery to top level CMake.
      * Move affinity, concurrency, MPI init guard, and gpu detection and negotiation functionality out of `sup` and into new library `arborenv`.
      * Move `include/arbor` in project tree to `arbor/include/arbor` (for consistency across `sup`, `arbor`, and `arborenv` subdirectories.)
      * Wrangle more explicit library dependency adding CMake code into the installed `arbor-config.cmake`, to help mitigate [CMake issue #18614](https://gitlab.kitware.com/cmake/cmake/issues/18614).
      * Have `arborenv` code throw `std::runtime_exception` instead of `arb::arbor_error`. (We are still using `arb::mpi_error` though for a failure in `with_mpi`.)
      * Move `scope_exit` into the `arb::util` namespace.
      * Merge `affinity.hpp` into `concurrency.hpp`.
      * Rename `gpu.hpp` to `gpu_env.hpp` in `arborenv` includes.
      
      Fixes #647.
      f4b2e034
  5. Jan 22, 2019
  6. Dec 18, 2018
    • Sam Yates's avatar
      Wrap std::function for sup::on_scope_exit. (#665) · f0b5892c
      Sam Yates authored
      * Provide a helper wrapper for use behind the scenes in the
      implementation of `sup::on_scope_exit` so that we can work around
      `std::function` not being nothrow move constructible (and maintaining
      the nothrow move on the `sup::scope_exit` structure).
      
      Fixes #664.
  7. Dec 17, 2018
    • noraabiakar's avatar
      Assertion fix (#663) · 6db581c1
      noraabiakar authored and Sam Yates's avatar Sam Yates committed
      Events arrive already sorted first by index then by time. 
      * Remove sort by event index.
      * Replace assertion that events are sorted by time with assertion that they are sorted by index. Assertion that the subrange of events with the same index is sorted by time already exists.
      6db581c1
  8. Nov 13, 2018
    • Felix Huber's avatar
      squashed merge for fine matrix solver · 0b7f88ca
      Felix Huber authored and Benjamin Cumming's avatar Benjamin Cumming committed
      0b7f88ca
    • Sam Yates's avatar
      Revert "Squashed merge for fine matrix solver (#640)" · 67b70a80
      Sam Yates authored and Benjamin Cumming's avatar Benjamin Cumming committed
      This reverts commit be2a8a9f.
      67b70a80
    • Benjamin Cumming's avatar
      Squashed merge for fine matrix solver (#640) · be2a8a9f
      Benjamin Cumming authored and Sam Yates's avatar Sam Yates committed
      Add a new Hines matrix solver implementation for the GPU that can solve a single tree in parallel with multiple threads. It replaces the interleaved solver, which used a single thread to solve each matrix.
      Branches with the same common root in the tree can be solved independently on each of the forward and backward solution passes. 
      
      * Add a matrix storage type, `arb::gpu::matrix_state_fine` that stores the branches of multiple trees for efficient backward and forward substitution.
      * Extend the `arb::tree` data structure to support operations for choosing a new root node and determining a root node which minimises the maximum distance between the root and any of the trees leaves. 
      * Implement code for rebalancing a set of matrix trees, a.k.a. a "forest" of trees.
      * Add CUDA kernels for efficiently performing matrix assembly and matrix solution steps.
      * Add CMake option `ARB_WITH_GPU_FINE_MATRIX` for toggling the new solver (default `on`).
      be2a8a9f
  9. Oct 15, 2018
  10. Oct 12, 2018
    • Sam Yates's avatar
      Smaller default build; check MPI support via find_package component. (#619) · 28e45aee
      Sam Yates authored and Benjamin Cumming's avatar Benjamin Cumming committed
      Fixes #618 and fixes #617.
      
      *  Add convenience targets: 'examples' for all examples; 'tests' for all tests.
      * Add support for component-testing in installed CMake package.
      * Allow test for MPI support via find_package via component.
      * Remove REQUIRED specification from `find_dependency()` commands in generated config.
      * Update `mech_vec.cpp` to match new `fvm_lowered_cell_impl` constructor.
      v0.1
      28e45aee
  11. Oct 01, 2018
    • Sam Yates's avatar
      Fix double throw of captured exception in thread group. (#606) · d6aec81a
      Sam Yates authored and Benjamin Cumming's avatar Benjamin Cumming committed
      Fixes #603.
      
      * Clear exception pointer in exception_state helper class after move of state.
      * Rename exception_state::get() method to reset().
      * Call std::terminate() if task_group is destroyed before tasks are collected with wait().
      * Do not attempt to collect tasks in destructor for task_group.
      * Do not attempt to rethrow exception in destructor for exception_state.
      * Add unit test to verify correct exception behaviour when a task_group is runs and waits on a series of tasks.
      * Add unit test for terminate behaviour as above.
      
      Code quality fix ups:
      * Remove unused warning variable warning in threading exception tests.
      * Address if-statement spacing in threading.hpp.
      * Use ARB_HAVE_MPI in execution_context.cpp instead of introducing a dependency on generated version header via feature macro ARB_MPI_ENABLED.
      d6aec81a
  12. Sep 26, 2018
    • noraabiakar's avatar
      Threading exceptions (#595) · b5662870
      noraabiakar authored and Benjamin Cumming's avatar Benjamin Cumming committed
      Propagate exceptions generated in `task_group` tasks on different threads in the threading backend, so that they are thrown on the main thread on `task_group.wait()`.
      
      Add tests that verify that exceptions are propagated correctly.
      
      Fixes #310.
      b5662870
  13. Sep 19, 2018
  14. Sep 17, 2018
    • noraabiakar's avatar
      Dry-run mode (#582) · a2b39382
      noraabiakar authored and Benjamin Cumming's avatar Benjamin Cumming committed
      Dry-run mode: 
      * An implementation of distributed_context that is used to mimic the performance of running an MPI distributed simulation with n ranks.
      * Verifiable against an MPI run with the same parameters. 
      
      Implementation: 
      * Describe the model on a single domain (tile) and translate it to however many domains we want to mimic using arb::tile and arb::symmetric_recipe. This allows us to know the exact behavior of the entire system by only running the simulation on a single node.
      * Mimic communication between domains using arb::dry_run_context
      
      Example: 
      * dryrun in example/ is a verifiable example of using dry-run mode with mc_cells
      
      Other:
      * Documentation of dry-run mode 
      * unit test for dry_run_context 
      a2b39382
  15. Aug 30, 2018
    • Benjamin Cumming's avatar
      Opaque Public Context (#576) · d637c8bc
      Benjamin Cumming authored
      Make the execution context presented to users an opaque handle, moving all implementation of the gpu, thread and distributed contexts into the back end.
      
      * move `execution_context` and `distributed_context` definitions to the back end
      * create `execution_context` handle called `context` in the public API
      * provide `make_context` helper functions that build different context configurations (default, user-specified local resources, with MPI)
      * update documentation for all parts of the public API that touch contexts
      * move `distributed_context` docs to the developer documentation (from the public API docs)
  16. Aug 24, 2018
  17. Aug 22, 2018
  18. Aug 20, 2018
    • Sam Yates's avatar
      Global temperature for NMODL mechanisms. (#565) · fa0d7aef
      Sam Yates authored and Benjamin Cumming's avatar Benjamin Cumming committed
      Global temperature for mechanisms.
      
      * Make 'celsius' magic in modcc: now an indexed variable.
      * Add a new temperature data source for indexed variables.
      * Add support to printers for indexed variables that reference a scalar.
      * Check that indexed variables aren't used in PROCEDURE blocks (this is a problem not just for 'celsius').
      * Modify built-in mod files to pass celsius as a parameter to rates() procedures.
      * Add global temperature to shared_state classes, and initialize through backend mechanism superclasses.
      * Add some infrastructure for unit-test only mechanisms.
      * Set modcc flags globally in top level CMakeLists.txt.
      * Add test mechanism/module for checking celsius setting.
      * Add unit test for multicore and gpu mechanism celsius setting.
      * Make common mechanism private field data access helper for unit tests.
      * Use helper in temperature, synapses tests.
      * Fix warning in `distribued_context.hpp` about errant semicolon.
      * Fix global scal...
      fa0d7aef
  19. Jul 31, 2018
    • noraabiakar's avatar
      Manage distributed_context using shared pointers (#555) · 0d6b365a
      noraabiakar authored and Sam Yates's avatar Sam Yates committed
      * Replace distributed_contest with shared_ptr<distributed_context> in execution_context and pass around the shared pointer instead of a raw pointer.
      * Fix construction of mpi_context
      * Remove num_threads() from arb and arb::threading. Modify mpi_context so it also returns a shared_ptr. proc_allocation is initialized from execution context to determine available resources.
      * Rename threading backend files. Delete useless files.
      * Pass execution_context by const reference or value.
      * Remove code duplication in thread_system constructors.
      0d6b365a
  20. Jul 26, 2018
    • Sam Yates's avatar
      Return view from schedule, replace time_seq. (#536) · 0d20df25
      Sam Yates authored
      Reduce redundant functionality across event_generator, time_seq
      and schedule by providing a low-heap overhead interface to schedule
      and using that for time sequences in event_generator and specialized
      cell groups.
      
      * Have schedule return pair of pointers as view to generated times.
      * Fix missing DEBUG/TRACE functionality.
      * Use rate instead of mean_dt for Poisson schedule.
      * Move merge_events() functionality to simulator.cpp.
      * Migrate event_generator to event span interface.
      * Migrate tourney_tree to event span interface.
      * Only invoke tourney_tree merge if generators have events in the epoch.
      * Use schedule for times in event_generator implementations.
      * Replace seq_generator with explicit_generator that keeps a copy of events.
      * Replace vector_backed_generator and poisson_generator with schedule_generator.
      * Replace time_seq uses with schedule.
      * Add default empty schedule.
      * Move rounding error test for regular time sequence into sch...
  21. Jul 25, 2018
    • Benjamin Cumming's avatar
      Remove `memory::array` from `arb::tree` (#547) · af5fe62a
      Benjamin Cumming authored
      This small refactor simplifies the interface and implementation of the `tree` type.
      * use `std::vector` instead of `memory::array` for internal storage in `arb::tree`
      * return a `util::range` intstead of a view for `tree::children(int)`
      * remove unused functionality for changing the root of a tree.
  22. Jul 24, 2018
    • noraabiakar's avatar
      task_system as part of an execution_context (#537) · 7a6c1031
      noraabiakar authored and Benjamin Cumming's avatar Benjamin Cumming committed
      - Task system is no longer a single system private to the implementation of the threading backend and used everywhere. A separate task_system can be used (with a specified number of threads) for every simulation.
      - arb::execution_context is the interface to task_system  and the previously defined distributed_context
      - TBB and serial support has been removed. Cthreads is the only threading backend available. 
      7a6c1031
  23. Jul 20, 2018
    • Sam Yates's avatar
      Refactor modccutil.hpp (#542) · 5da63dde
      Sam Yates authored
      Fixes #139.
      
      * Split colours and `pprintf(...)` into `io/pprintf.hpp` header.
      * Remove generic `to_string()` function, replacing its very occasional usage with `pprintf`.
      * Move block pretty printing into own .cpp file; this is the only place that the vector ostream printer was used.
      * Remove `enum_hash`, as not needed with C++14.
      * Move `is_in` utility function to `util.hpp`.
      * Remove old SIMD printer backend code.
  24. Jul 19, 2018
    • noraabiakar's avatar
      Cthreads: implement task queue per thread with task stealing (#528) · 4d63988a
      noraabiakar authored and Sam Yates's avatar Sam Yates committed
      Cthreads classes:
      - Notification queue : Manages tasks: tries or forces popping and pushing tasks.  
      - Task system : manages the notifications queues; controls which queue to pop from/push to; controls spinning on queues if necessary; manages creating/joining threads. Is a singleton.
      - Task group : manages synchronization on a group of tasks. 
      
      Operation: 
      - Each thread has an associated queue
      - Task system _tries to_ push tasks in one of the available queues. If it is unable to acquire a lock on a queue, it tries the next in a round robin fashion. After it loops all queues if it still hasn't successfully pushed the task, it spins on a single queue until lock is acquired and task is pushed. 
      - Task system _tries to_ pop a task from the calling thread's queue. If it is unable to acquire the lock, it tries to steal the task from another thread's queue, in a round robin loop. If it is still unable to pop a task, it spins on its the c...
      4d63988a
  25. Jul 13, 2018
    • Sam Yates's avatar
      Feature/lib install target part 4 (#531) · d6af0c4d
      Sam Yates authored and Benjamin Cumming's avatar Benjamin Cumming committed
      All example code and validation tests no longer require access to private include directories. This provides the minimal requirement for an installable target
      
      Note that it is still not possible to separately build mechanisms from NMODL with just the public includes, and there is not yet any package configuration file creation for use with CMake or pkg-config.
      
      * Replace `hw::node_info` with `proc_allocation`, describing local resources for the purposes of domain decomposition.
      * Group processor counting and gpu counting implementation under `node_info.cpp`.
      * Remove `domain_decomposition` dependency from `cell_group_factory.hpp` so we can use the latter to test for backend support for a cell kind.
      * Add `arb::cell_kind_implementation()` which performs the mapping from cell kind and backend kind to a `cell_group_ptr`-producing function (this will then become the site for custom cell group kind mapping support in future work).
      * Move headers for aux library into `aux/include/aux`, so that there is less ambiguity in header location within test and example code.
      * Simplify a little the affinity scanning code.
      * Add `sysconf()` and `std::thread::hardware_concurrency()` fallbacks for processor count determination.
      * Move `util::mask_stream`, `util::path`, `util::scope_exit` into aux header.
      * Remove `util::nop`.
      * Remove `io::exporter` and `io::exporter_spike_file`; replace with simpler interface in `aux::spike_emitter`.
      * Move `load_balance.hpp`, `math.hpp`, `scwio.hpp` into public includes.
      * Move path, glob and scope_exit utilities to aux lib.
      * Move cell group size-based partitioning functionality into partition_load_balance, through the use of new `partition_hint` structure.
      * Remove brunel example specific partitioner.
      * Move brunel example option code out of `::arb` namespace.
      * Move swc routines out of `arb::io` and into `arb::`.
      * Specialize public swc-routines to take a vector of swc_record objects instead of an arbitrary sequence; place implementations into swcio.cpp.
      * Remove dependency on `util/strprintf.hpp` from lmorpho.
      * Remove `arb::math::min`, `arb::math::max`.
      * Remove range utility dependence from validation tests: add piece-wise linear interpolator in test/validation/interpolate.hpp; remove `times` and `values` adaptors for simple trace data; add test/validation/util.hpp with generic size function and a `to_string` for `backend_kind`.
      * Add `aux::open_or_throw` helper function to replicate no-overwrite spike output behaviour in example applications.
      * Add `aux::strsub` simple string substitution function for use in examples, so as to avoid a `util::strprintf` or `util::pprintf` dependency.
      * Remove arbor private header dependencies from examples and validation tests.
      d6af0c4d
  26. Jul 06, 2018
    • Sam Yates's avatar
      Migrate source/build to c++14 ... · 3ee79191
      Sam Yates authored and Benjamin Cumming's avatar Benjamin Cumming committed
      Migrate source/build to c++14                                                                                                                    (#522)
      
      * Update `CMakeLists.txt` for C++14 option.
      * Update to gcc 6 minimum.
      * Update travis CI from gcc-5 to gcc-6
      * Use `std::..._t` style type traits, replacing `util::` aliases.
      * Use `std::cbegin`, `std::cend`, and `std::make_unique`, replacing `util::` versions.
      * Remove `DEDUCED_RETURN_TYPE` macros.
      * Remove redundant return type specifications.
      * Use correct ADL for `begin` and `end` in (almost all) the range utilities.
      * Remove redundant `mechinfo` ctor (aggregate initialization suffices).
      * Use lambda capture initializers where appropriate.
      * Use generic `std::equal_to`.
      * Use variable templates for `math::infinity` and `math::pi`.
      * Remove `enum_hash` workaround.
      * Use `""s` string literals where we were using our own `""_s` construction.
      * Use generic lambda for recursive lambda instead of `std::function` wrapper.
      * Use generic lambda for generic arithmetic tests.
      
      Fixes #358.
      3ee79191
    • Sam Yates's avatar
      Fix GPU breakage in last PR (#520) · 26eda785
      Sam Yates authored and Benjamin Cumming's avatar Benjamin Cumming committed
      Who broke the build? Sam did!
      26eda785
  27. Jul 05, 2018
    • Sam Yates's avatar
      Test for xlC and refuse to build with it. (#519) · 775fe807
      Sam Yates authored and Benjamin Cumming's avatar Benjamin Cumming committed
      Fixes issue #517.
      
      Deprecate the IBM xlC compiler.
      xlC generates code that is an order of a magnitude slower than gcc, while generating spurious warnings, and requiring hacks and workarounds to pass all tests.
      Supporting it makes no sense.
      
      * Add test and fatal error for xlC detection in CheckCompilerXLC.cmake.
      * Move xlC 13 misdetection work around to CheckCompilerXLC.cmake.
      * Remove xlC-specific compatibility workarounds from code.
      775fe807
    • Sam Yates's avatar
      Feature/lib install target part 3 (#518) · 40612fa7
      Sam Yates authored and Benjamin Cumming's avatar Benjamin Cumming committed
      This time we're moving `recipe.hpp` and `simulation.hpp`, plus the requirements they bring.
      
      Code changes:
      * Pimplize `simulation`.
      * Consolidate arbor exceptions: all non-cell kind specific exceptions that might be expected to reach user code now have consistent messages and fit in an exception hierarchy based at `arb::arbor_exception`. Internal errors throw an `arb::arbor_internal_error` exception.
      * Renamed `postsynaptic_spike_event` to `spike_event`. (Note: `pse_vector` name is unchanged.)
      * Repurposed `pprintf` and moved it into `strprintf.h` — further consolidation is a TODO.
      * Made a generic `util::to_string` to avoid redundancy of `operator<<` overloads and other `to_string` definitions. Defaults to ADL `to_string`, `std::to_string`, and finally tries using `operator<<`.
      40612fa7
  28. Jul 03, 2018
    • Sam Yates's avatar
      Move cell description types to public includes. (#508) · a1894edc
      Sam Yates authored and Benjamin Cumming's avatar Benjamin Cumming committed
      Further work to public install target.
      
      * Move SIMD classes, cell description classes, simple sampler to public include.
      * Rename `cell` to `mc_cell`, `segment` to `mc_segment`, and remove `_description` from cell description class names and includes.
      * Move `compartment_model` out of `mc_cell` interface and use only in `fvm_layout.cpp`.
      * (Provisionally) remove area/volume methods on `mc_cell` and `mc_segment`.
      a1894edc
  29. Jun 25, 2018
    • Sam Yates's avatar
      Feature/lib install target part i (#506) · ad1c78ab
      Sam Yates authored and Benjamin Cumming's avatar Benjamin Cumming committed
      CMake and build refactoring
      
      *   Use CUDA as first-class language (leading to CMake 3.9 minimum version requirement).
      
      *   Use 'modern CMake' interface libraries for compiler options, include file and library dependency tracking. Interface library targets:
          * `arbor-deps`: compiler options and library requirements for the `libarbor.a` static library, as governed by configure-time options and environment.
          * `arbor-private-headers`: include path for non-installed headers, as required by unit tests and arbor itself.
          * `arbor-aux`: helper classes and utilities used across tests and examples.
          * `ext-json`, `ext-tclap`, `ext-tbb`, `ext-benchmark`, `ext-sphinx_rtd_theme`: externally maintained software that we include (directly or via submodule) in the `ext/` subdirectory.
       
      *   Single static library `libarbor.a` includes all built-in modules and CUDA objects.
      
      *   Simply configuration options:
          *  `ARB_WITH_TRACE`, `ARB_AUTORUN_MODCC_ON_CHANGES` `ARB_SYSTEM_TYPE` removed.
          * External `modcc` is provided by `ARB_MODCC` configuration option; if provided `modcc` is still buildable, but is not included in the default target.
          * `ARB_PRIVATE_TBBLIB`, defaulting to `OFF`, instructs the build to make TBB from the included submodule.
      
      *   Extend `ErrorTarget` functionality to provide a dummy target or an error target based on a condition.
      *   Generate header version defines and library version variables based on git status and project version, via new script `include/git-source-id`.
      *   All generated binaries now placed in `bin/` subdirectory at build.
      *   Install targets installs: public headers (incomplete); static library; `modcc` tool; `lmorpho` executable; `html` documentation (examples, tests and validation data are currently not installed).
      *   Executable targets have had the `.exe` suffix removed; unit tests are labelled `unit` (arbor unit tests), `unit-modcc` (modcc unit tests), `unit-local` (distributed tests with local context), `unit-mpi` (distributed tests with MPI context).
      *   More graceful handling of configure-time detection of `nrniv`, Julia and required Julia modules for validation data generation.
      *   Add `cmake/FindJulia.cmake`, `cmake/FindTBB.cmake`  package finders, and adjust `cmake/FindUnwind.cmake` to use link library-style properties.
      *  Adjust travis script to test `unit-local` and `unit-mpi` if appropriate.
      *  Simply documentation `conf.py`.
      
      Source relocation and reorganization
      
      * All external project sources and files moved to `ext/`.
      * Source code refactoring to decouple library-using code from the configure-time definitions that govern arbor behaviour: removes conditional code in public headers that depends upon `ARB_WITH_X`-type definitions at compile time. Affected code is is in the public interfaces for MPI, the threading implementation, and the profiler.
      * Remove `util/debug.hpp`; split out functionality for pretty-printing from assertion handling.
      * Make FVM cell non-physical voltage check a run-time cell-group parameter.
      * Move spike double buffer implementation to `simulation.cpp`.
      * Make timer utility wrap POSIX `clock_gettime` independent of threading configuration.
      * Make `mpi_error` derive from `system_error` and follow C++11 `system_error` semantics.
      * `EXPECTS` macro replaced by `arb_assert` macro.
      * JSON dependency removed from `libarbor.a` and header files: moved to auxiliary library.
      * Publicly visible macros garner an `ARB_` prefix as required.
      * Move SWC test file to `test/unit` directory.
      * Work-in-progress splitting of public from private includes: as a convention not entirely adhered to as yet, private headers within arbor source are included with `""`, public headers with `<>`.
      
      Modcc interface changes
      
      * Expose via `--namespace` option the functionality that sets the namespace in generated code.
      * Use `--profile` option to add profiler hooks to generated code; uses public function interface directly rather than `PE/PL` macros in order to avoid public `PE` and `PL` defines.
      ad1c78ab