Template Numerical Library  version develop:5465c2260
Core concepts

TNL is based on the following core concepts:

1. Allocators
• Allocator handles memory allocation and deallocation.
• TNL allocators are fully compatible with the standard C++ concept
• Multiple allocators can correspond to the same "memory space".
2. Devices (TODO: rename to Executor or something like that)
• Device is responsible for the execution of algorithms in a specific way.
• Algorithms can be specialized by the Device template parameter.
3. Communicators
• Communicators represent the main abstraction for distributed computations, where multiple programs (or instances of the same program) have to communicate with each other.
• At present, there are only two communicators: MpiCommunicator (uses MPI) and NoDistrCommunicator (dummy communicator without any distribution support).
4. Algorithms
• Basic (container-free) algorithms specialized by Device/Executor.
• ParallelFor, Reduction, MultiReduction, ArrayOperations, ...
5. Containers
• Classes for general data structures. (TODO: alternatively use "Dense" and "Sparse", because a dense matrix can be an extended alias for 2D array)
• Array, Vector (also VectorOperations), NDArray, ...
6. Views
• Views wrap only a raw pointer to data and some metadata (such as the array size), they do not do allocation and deallocation of the data. Hence, views have a fixed size which cannot be changed.
• Views have a copy-constructor which does a shallow copy. As a result, views can be passed-by-value to CUDA kernels or captured-by-value by device lambda functions.
• Views have a copy-assignment operator which does a deep copy.
• Views have all other methods present in the relevant container (data structure).

TODO: formalize the concepts involving lambda functions (e.g. in Reduction)