Expression Templates Library (ETL) 1.0
I've just released the first official version of my Expression Templates Library (ETL for short): The version 1.0.
Until now, I was using a simple rolling release model, but I think it's now time to switch to some basic versioning. The project is now at a stable state.
ETL 1.0 has the following main features:
Smart Expression Templates
Matrix and vector (runtime-sized and compile-time-sized)
Simple element-wise operations
Reductions (sum, mean, max, ...)
Unary operations (sigmoid, log, exp, abs, ...)
Matrix multiplication
Convolution (1D and 2D and higher variations)
Max Pooling
Fast Fourrier Transform
Use of SSE/AVX to speed up operations
Use of BLAS/MKL/CUBLAS/CUFFT/CUDNN libraries to speed up operations
Symmetric matrix adapter (experimental)
Sparse matrix (experimental)
Examples
Here is an example of expressions in ETL:
etl::fast_matrix<float, 2, 2, 2> a = {1.1, 2.0, 5.0, 1.0, 1.1, 2.0, 5.0, 1.0}; etl::fast_matrix<float, 2, 2, 2> b = {2.5, -3.0, 4.0, 1.0, 2.5, -3.0, 4.0, 1.0}; etl::fast_matrix<float, 2, 2, 2> c = {2.2, 3.0, 3.5, 1.0, 2.2, 3.0, 3.5, 1.0}; etl::fast_matrix<float, 2, 2, 2> d(2.5 * ((a >> b) / (log(a) >> abs(c))) / (1.5 * scale(a, sign(b)) / c) + 2.111 / log(c));
Or another I'm using in my neural networks library:
In that case, the vector-matrix multiplication will be executed using a BLAS kernel (if ETL is configured correclty) and the assignment, the sigmoid and the addition will be automatically vectorized to use either AVX or SSE depending on the machine.
Or with a convolutional layer and a ReLU activation function:
etl::reshape<1, K, NH1, NH2>(h_a) = etl::conv_4d_valid_flipped(etl::reshape<1, NC, NV1, NV2>(v_a), w); h = max(b_rep + h_a, 0.0);
This will automatically be computed either with NVIDIA CUDNN (if available) or with optimized SSE/AVX kernels.
For more information, you can take a look at the Reference on the wiki.
Next version
For the next version, I'll focus on several things:
Improve matrix-matrix multiplication kernels when BLAS is not available. There is a lot of room for improvement here
Complete support for symmetric matrices (currently experimental)
Maybe some new adapters such as Hermitian matrices
GPU improvements for some operations that can be done entirely on GPU
New convolution performanceimprovements
Perhaps more complete parallel support for some implementations
Drop some compiler support to use full C++14 support
Download ETL
You can download ETL on Github. If you only interested in the 1.0 version, you can look at the Releases pages or clone the tag 1.0. There are several branches:
master Is the eternal development branch, may not always be stable
stable Is a branch always pointing to the last tag, no development here
For the future release, there always will tags pointing to the corresponding commits. I'm not following the git flow way, I'd rather try to have a more linear history with one eternal development branch, rather than an useless develop branch or a load of other branches for releases.
Don't hesitate to comment this post if you have any comment on this library or any question. You can also open an Issue on Github if you have a problem using this library or propose a Pull Request if you have any contribution you'd like to make to the library.
Hope this may be useful to some of you :)
Comments
Comments powered by Disqus