- Feb 05, 2019
-
-
Sam Yates authored
* Add unit test for event delivery pathing. * Temporarily disable GJ-specific test pending GJ PR.
-
- Feb 04, 2019
-
-
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.
-
- Feb 01, 2019
-
-
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.
-
- Jan 31, 2019
-
-
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.
-
- Jan 22, 2019
-
-
Sam Yates authored
* Fix bug in optimized (scalar) unconstrained indirect addition. * Fix bug in indirect arithmetic and scatter tests that tested only a subset of the test data.
-
- Dec 18, 2018
-
-
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.
-
- Dec 17, 2018
-
-
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.
-
- Nov 13, 2018
-
-
-
This reverts commit be2a8a9f.
-
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`).
-
- Oct 15, 2018
-
-
Fixes #622.
-
- Oct 12, 2018
-
-
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.
-
- Oct 01, 2018
-
-
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.
-
- Sep 26, 2018
-
-
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.
-
- Sep 19, 2018
-
-
- Sep 17, 2018
-
-
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
-
- Aug 30, 2018
-
-
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)
-
- Aug 24, 2018
-
-
Benjamin Cumming authored
Move implementation of `gpu_context` from header to `cpp` file, so that `ARB_WITH_CUDA` doesn't leak from library implementation.
-
- Aug 22, 2018
-
-
* Add gpu_context as part of execution context containing information about GPU availability, managed_memory synchronization, and atomic double availability. * Choose between ON and OFF for ARB_GPU in CMake. If ON compile for K20, K80, and P100 Note that we still need compile time information about the GPU in cuda_atomic.hpp for atomicAdd(double*, double*). This is because the function is only defined when the program is compiled for sm_60 or more.
-
Use a compat::fma wrapper for std::fma to avoid a bug in the tree optimizer in GCC version < 8.2. See: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87046 Fixes #568.
-
- Aug 20, 2018
-
-
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...
-
- Jul 31, 2018
-
-
* 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.
-
- Jul 26, 2018
-
-
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...
-
- Jul 25, 2018
-
-
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.
-
- Jul 24, 2018
-
-
- 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.
-
- Jul 20, 2018
-
-
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.
-
- Jul 19, 2018
-
-
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...
-
- Jul 13, 2018
-
-
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.
-
- Jul 06, 2018
-
-
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.
-
Who broke the build? Sam did!
-
- Jul 05, 2018
-
-
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.
-
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<<`.
-
- Jul 03, 2018
-
-
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`.
-
- Jun 25, 2018
-
-
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.
-