2011-10-08 8 views
1

Eigen 라이브러리를 사용하는 프로그램에서 2D 벡터를 사용해야합니다. 의 x()y() 계산이 동일한 경로를 따라 양쪽으로 vectorisation에 대한 주요 후보처럼 보인다 지저분한 있지만,Eigen을 사용하여 표현식을 벡터화하기

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()); 
} 

이 표현 : 내 내부 루프에서 나는 다음과 같은 기능을 가지고있다. 내 질문은 수동으로 어셈블리를 드롭 다운하지 않고 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

. 그래서 내가 왜 수동으로하고 싶은지 알 수 있습니다.