2014-10-22 1 views
1

안녕하세요, 저는 Yeppp를 사용하여 코드에서 대수학의 성능을 향상시키고 자합니다! 나는 g ++ 컴파일러를 사용하고Yeppp의 성능! 네이티브 구현보다 느립니다.

#include "Vector3.h" 
#include <cmath> 
#include "yepCore.h" 

Vector3::Vector3() 
{ 
    //ctor 
} 

Vector3::~Vector3() 
{ 
    //dtor 
} 

Vector3::Vector3(float X, float Y, float Z) 
{ 
    x = X; 
    y = Y; 
    z = Z; 
} 


float& Vector3::operator[](int idx) 
{ 
    return (&x)[idx]; 
} 

Vector3& Vector3::normalize() 
{ 
#if USE_YEPPP 
    float inf; 
    yepCore_SumSquares_V32f_S32f(&x, &inf, 3); 
    yepCore_Multiply_IV32fS32f_IV32f(&x, 1.0f/sqrt(inf), 3); 
#else 
    float inf = 1.0f/sqrt((x * x) + (y * y) + (z * z)); 
    x *= inf; 
    y *= inf; 
    z *= inf; 
#endif 
    return *this; 

} 

Vector3 Vector3::cross(Vector3& rh) 
{ 
    return Vector3 (
       (y * rh.z) - (z * rh.y), 
       (z * rh.x) - (x * rh.z), 
       (x * rh.y) - (y * rh.x) 
    ); 
} 

float Vector3::dot(Vector3& rh) 
{ 
#if USE_YEPPP 
    float ret = 0; 
    yepCore_DotProduct_V32fV32f_S32f(&x, &rh.x, &ret, 3); 
    return ret; 
#else 
    return x*rh.x+y*rh.y+z*rh.z; 
#endif 
} 

Vector3 Vector3::operator*(float scalar) 
{ 
#if USE_YEPPP 
    Vector3 ret; 
    yepCore_Multiply_V32fS32f_V32f(&x, scalar, &ret.x , 3); 
    return ret; 
#else 
    return Vector3(x*scalar, y*scalar,z*scalar); 
#endif 
} 

Vector3 Vector3::operator+(Vector3 rh) 
{ 
#if USE_YEPPP 
    Vector3 ret; 
    yepCore_Add_V32fV32f_V32f(&x, &rh.x, &ret.x, 3); 
    return ret; 
#else 
    return Vector3(x+rh.x, y+rh.y, z+rh.z); 
#endif 
} 

Vector3 Vector3::operator-(Vector3 rh) 
{ 
#if USE_YEPPP 
    Vector3 ret; 
    yepCore_Subtract_V32fV32f_V32f(&x, &rh.x, &ret.x, 3); 
    return ret; 
#else 
    return Vector3(x-rh.x, y-rh.y, z-rh.z); 
#endif 
} 

Vector3 operator*(float s, const Vector3& v) 
{ 
#if USE_YEPPP 
    Vector3 ret; 
    yepCore_Multiply_V32fS32f_V32f(&v.x, s, &ret.x , 3); 
    return ret; 
#else 
    return Vector3(s*v.x,s*v.y,s*v.z); 
#endif 
} 

: 라이브러리 그러나 성능이 실제로 여기에 ... 을 악화되어 Vector 클래스 코드의 조각이다. 컴파일러 옵션 : - : 그래서 g ++ -shared -lpthread -lyeppp -ldl

그램 ++ -Wall -fexceptions -fPIC -Wl, -std = C++ 11 -pthread -ggdb 링커 옵션에는 것과 같이 필요하지 어떤 생각을 잘못 했나요?

+0

YEPPP는 당신이하는 일을 계산하는 데 동일한 수식을 사용하고 인수가 의미가 있는지 확인하는 오버 헤드를 생각합니다. 보통 라이브러리는 알고리즘이 자신의 알고리즘보다 뛰어나다면 성능을 향상시킵니다.이 경우 알고리즘은 단지 수학이기 때문에 어렵습니다. – SlySherZ

답변

5

Yeppp! 100 개 이상의 요소를 처리 할 수 ​​있도록 최적화되어 있습니다.

SIMD를 사용하는 기능이 제한되어 있고 함수 호출, 동적 디스 패칭 및 매개 변수 검사의 오버 헤드 때문에 작은 배열 (예 : 길이가 3 인 배열)에서는 효율적이지 않습니다.

+1

Marat에게 감사드립니다. 그것은 나의 의심이었습니다. 그래서 단일 개체 작업을 위해 더 멀리 최적화 할 수있는 방법이 없다고 생각합니다. – SunnyDark