Re: [eigen] Eigen containers cannot be vectorized |
[ Thread Index | Date Index | More lists.tuxfamily.org/eigen Archives ]
Hi, what about this: #include <Eigen/Dense> void f(Eigen::Matrix<Eigen::Index, Eigen::Dynamic, Eigen::Dynamic>& A) { const Eigen::Index cols = A.cols(); const Eigen::Index rows = A.rows(); for (Eigen::Index j = 0; j < cols; ++j) { for(Eigen::Index i = 0; i < rows; ++i) { A(i, j) = i + j; } } } Best rgds, Joseph On 12/08/2016 02:24 PM, Francois Fayard wrote: > Hi, > > I have found that Eigen containers cannot be vectorized. For instance, > the following code: > > #include <Eigen/Dense> > > void f(Eigen::Matrix<Eigen::Index, Eigen::Dynamic, Eigen::Dynamic>& A) { > for (Eigen::Index j = 0; j < A.cols(); ++j) { > for(Eigen::Index i = 0; i < A.rows(); ++i) { > A(i, j) = i + j; > } > } > } > > is not vectorized by the Intel compiler. It says that the iteration > count cannot be computed before the execution of the loop. > > It is due to the fact that A is made of: > Eigen::Index* data_; > Eigen::Index cols_; > Eigen::Index rows_; > The compiler has no way of knowing that data_ does not point to rows_. > As a consequence, it does not know that the operation A(i, j) = i + j > does not change the number of rows of A. As a consequence, the loop is > not countable and cannot be vectorized. > > One way to fix this, would be to store the number of columns as a > pointer. If cols_ becomes a Eigen::Index* such that the number of > columns is cols_ - data_, the problems get fixed, and compilers can know > vectorize the inner loop. > > Best regards, > > François Fayard > Founder & Consultant - Inside Loop > Applied Mathematics & High Performance Computing > Tel: +33 (0)6 01 44 06 93 > Web: www.insideloop.io <http://www.insideloop.io> > > PS: I have found that if you change the type to double, it does not get > vectorized too, but I have no idea why.
Attachment:
signature.asc
Description: OpenPGP digital signature
Mail converted by MHonArc 2.6.19+ | http://listengine.tuxfamily.org/ |