2011-10-08 5 views
1

В моей программе, которая использует библиотеку 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

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^