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
This commit is contained in:
Benoit Steiner
2014-06-13 09:56:51 -07:00
parent aa664eabb9
commit 38ab7e6ed0
14 changed files with 695 additions and 174 deletions

View File

@@ -153,6 +153,15 @@ struct TensorEvaluator<const TensorConvolutionOp<Indices, InputArgType, KernelAr
const Dimensions& dimensions() const { return m_dimensions; }
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalSubExprsIfNeeded() {
m_inputImpl.evalSubExprsIfNeeded();
m_kernelImpl.evalSubExprsIfNeeded();
}
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void cleanup() {
m_inputImpl.cleanup();
m_kernelImpl.cleanup();
}
void evalTo(typename XprType::Scalar* buffer) const {
for (int i = 0; i < dimensions().TotalSize(); ++i) {
buffer[i] += coeff(i);