Векторизация выражения с использованием Eigen - PullRequest
1 голос
/ 09 октября 2011

В моей программе, которая использует библиотеку Eigen, мне нужно работать с 2D-векторами. В моем внутреннем цикле у меня есть следующая функция:

static inline double eval(double x, double y, double xi, double yi)
{
    const double invlen2  = 1/(x*x + y*y);
    const double invlen4 = invlen2*invlen2;
    const double invlen6 = invlen4*invlen2;

    const double x2  = x*x,   y2  = y*y;
    const double x3  = x2*x,  y3  = y2*y;
    const double xi2 = xi*xi, yi2 = yi*yi;

    return x*invlen2 + invlen4*(x2*xi + 2*x*y*yi - xi*y2)
    + invlen6*(x3*xi2 + 3*x*y2*yi2 + 6*x2*y*xi*yi - 3*x*xi2*y2 - 2*y3*xi*yi - x3*yi2);
}

void f(Vector2d& out, const Vector2d& R, const Vector2d& r)
{
    out.x() = eval(R.x(), R.y(), r.x(), r.y());
    out.y() = eval(R.y(), R.x(), r.y(), r.x());
}

Это выражение, хотя и грязное, кажется основным кандидатом на векторизацию, так как вычисления x() и y() следуют одинаковым путям. Мой вопрос заключается в том, как сделать это с Eigen без необходимости вручную переходить на сборку.

1 Ответ

1 голос
/ 09 октября 2011

Этот ответ не имеет ничего общего с Eigen, но так как вы упомянули, что вручную переходите к сборке, я добавлю это.

Вам не нужно использовать сборку для векторизации кода.Существуют встроенные функции компилятора, которые позволяют векторизовать вручную без сборки:

http://software.intel.com/sites/products/documentation/studio/composer/en-us/2011/compiler_c/intref_cls/common/intref_overview.htm#intref_overview

При этом: похоже, что в Eigen уже есть внутренняя поддержка векторизации, но она не применимав вашем примере.Итак, я понимаю, почему вы хотите сделать это вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...