Commit Graph

726 Commits

Author SHA1 Message Date
Benoit Steiner
47981c5925 Added support for tensor slicing 2014-07-07 14:07:57 -07:00
Benoit Steiner
f80c8e17eb Silenced a compilation warning 2014-06-13 10:12:12 -07:00
Benoit Steiner
38ab7e6ed0 Reworked the expression evaluation mechanism in order to make it possible to efficiently compute convolutions and contractions in the future:
* The scheduling of computation is moved out the the assignment code and into a new TensorExecutor class
 * The assignment itself is now a regular node on the expression tree
 * The expression evaluators start by recursively evaluating all their subexpressions if needed
2014-06-13 09:56:51 -07:00
Benoit Steiner
aa664eabb9 Fixed a few compilation errors. 2014-06-10 10:31:29 -07:00
Benoit Steiner
4304c73542 Pulled latest updates from the Eigen main trunk. 2014-06-10 10:23:32 -07:00
Benoit Steiner
925fb6b937 TensorEval are now typed on the device: this will make it possible to use partial template specialization to optimize the strategy of each evaluator for each device type.
Started work on partial evaluations.
2014-06-10 09:14:44 -07:00
Benoit Steiner
a77458a8ff Fixes compilation errors triggered when compiling the tensor contraction code with cxx11 enabled. 2014-06-09 10:06:57 -07:00
Benoit Steiner
a669052f12 Improved support for rvalues in tensor expressions. 2014-06-09 09:45:30 -07:00
Benoit Steiner
36a2b2e9dc Prevent the generation of unlaunchable cuda kernels when compiling in debug mode. 2014-06-09 09:43:51 -07:00
Benoit Steiner
2859a31ac8 Fixed compilation error 2014-06-09 09:42:34 -07:00
Benoit Steiner
a961d72e65 Added support for convolution and reshaping of tensors. 2014-06-06 16:25:16 -07:00
Christian Seiler
96cb58fa3b unsupported/TensorSymmetry: factor out completely from Tensor module
Remove the symCoeff() method of the the Tensor module and move the
functionality into a new operator() of the symmetry classes. This makes
the Tensor module now completely self-contained without symmetry
support (even though previously it was only a forward declaration and a
otherwise harmless trivial templated method) and also removes the
inconsistency with the rest of eigen w.r.t. the method's naming scheme.
2014-06-04 20:44:22 +02:00
Christian Seiler
ea99433523 unsupported/TensorSymmetry: make symgroup construction autodetect number of indices
When constructing a symmetry group, make the code automatically detect
the number of indices required from the indices of the group's
generators. Also, allow the symmetry group to be applied to lists of
indices that are larger than the number of indices of the symmetry
group.

Before:
SGroup<4, Symmetry<0, 1>, Symmetry<2,3>> group;
group.apply<SomeOp, int>(std::array<int,4>{{0, 1, 2, 3}}, 0);

After:
SGroup<Symmetry<0, 1>, Symmetry<2,3>> group;
group.apply<SomeOp, int>(std::array<int,4>{{0, 1, 2, 3}}, 0);
group.apply<SomeOp, int>(std::array<int,5>{{0, 1, 2, 3, 4}}, 0);

This should make the symmetry group easier to use - especially if one
wants to reuse the same symmetry group for different tensors of maybe
different rank.

static/runtime asserts remain for the case where the length of the
index list to which a symmetry group is to be applied is too small.
2014-06-04 20:27:42 +02:00
Christian Seiler
cee62018fc unsupported/CXX11/Core: allow gen_numeric_list to have a starting point
Add a template parameter to gen_numeric_list that acts as a starting
point for the list, i.e. gen_numeric_list<int, 5, 4> will generate a
numeric_list<int, 4, 5, 6, 7, 8>.
2014-06-04 19:54:22 +02:00
Christian Seiler
58cfac9a12 unsupported/ C++11 workarounds: don't use hack for libc++ if not required
libc++ from 3.4 onwards supports constexpr std::get, but only if
compiled with -std=c++1y. Change the detection so that libc++'s
internals are only used if either -std=c++1y is not specified or the
library is too old, making the whole hack a bit more future-proof.
2014-06-04 18:47:42 +02:00
Christian Seiler
45515779d3 Fix compilation for CXX11/Tensor module if unsupported is not in include path 2014-06-04 18:31:02 +02:00
Benoit Steiner
6fa6cdd2b9 Added support for tensor contractions
Updated expression evaluation mechanism to also compute the size of the tensor result
Misc fixes and improvements.
2014-06-04 09:21:48 -07:00
Benoit Steiner
736267cf6b Added support for additional tensor operations:
* comparison (<, <=, ==, !=, ...)
  * selection
  * nullary ops such as random or constant generation
  * misc unary ops such as log(), exp(), or a user defined unaryExpr()
Cleaned up the code a little.
2014-05-22 16:22:35 -07:00
Benoit Steiner
7402fea0a8 Vectorized the evaluation of tensor expression (using SSE, AVX, NEON, ...)
Added the ability to parallelize the evaluation of a tensor expression over multiple cpu cores.
Added the ability to offload the evaluation of a tensor expression to a GPU.
2014-05-16 15:08:05 -07:00
Benoit Steiner
0320f7e3a7 Added support for fixed sized tensors.
Improved support for tensor expressions.
2014-05-06 11:18:37 -07:00
Benoit Steiner
c0f2cb016e Extended support for Tensors:
* Added ability to map a region of the memory to a tensor
  * Added basic support for unary and binary coefficient wise expressions, such as addition or square root
  * Provided an emulation layer to make it possible to compile the code with compilers (such as nvcc) that don't support cxx11.
2014-04-28 10:32:27 -07:00
Benoit Steiner
1afd50e0f3 Fixed a typo in CXX11Meta.h 2014-04-14 14:26:30 -07:00
Christian Seiler
f6bac196d5 C++11/Tensor: Fix copyright headers 2013-11-16 00:03:23 +01:00
Christian Seiler
03a956925a CXX11/TensorSymmetry: add symmetry support for Tensor class
Add a symCoeff() method to the Tensor class template that allows the
user of the class to set multiple elements of a tensor at once if they
are connected by a symmetry operation with respect to the tensor's
indices (symmetry/antisymmetry/hermiticity/antihermiticity under
echange of two indices and combination thereof for different pairs of
indices).

A compile-time resolution of the required symmetry groups via meta
templates is also implemented. For small enough groups this is used to
unroll the loop that goes through all the elements of the Tensor that
are connected by this group. For larger groups or groups where the
symmetries are defined at run time, a standard run-time implementation
of the same algorithm is provided.

For example, the following code completely initializes all elements of
the totally antisymmetric tensor in three dimensions ('epsilon
tensor'):

SGroup<3, AntiSymmetry<0,1>, AntiSymmetry<1,2>> sym;
Eigen::Tensor<double, 3> epsilon(3,3,3);
epsilon.setZero();
epsilon.symCoeff(sym, 0, 1, 2) =  1;
2013-11-14 23:35:11 +01:00
Christian Seiler
f97b3cd024 CXX11/Tensor: add simple initial tensor implementation
This commit adds an initial implementation of a class template Tensor
that allows for the storage of objects with more than two indices.
Currently, only storing data and setting the object to zero for POD
data types are implemented.
2013-11-14 22:52:37 +01:00
Christian Seiler
5e28c41549 C++11: add template metaprogramming helpers
Create a new directory CXX11 under unsupported/Eigen that contains code
that requires C++11. In that directory, add a few generic templates
useful for any module relying on C++11. These templates may be included
with #include <[unsupported/]Eigen/CXX11/Core>. At the moment, this
will only provide templates in the Eigen::internal namespace.
2013-11-14 22:27:06 +01:00