2014-10-22 96 views
1

您好,我正在嘗試在使用Yeppp的代碼中提高矢量代數的性能!然而庫的表現實際上是越來越差...... 這裏是一塊Vector類代碼:與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 
} 

我使用的G ++編譯器。 編譯選項:克++ -Wall -fexceptions -fPIC -Wl, - 無按需-std = C++ 11 -pthread -ggdb 連接器選項:克++ -shared -lpthread -lyeppp -ldl

所以任何想法我做錯了什麼?

+0

我想YEPPP使用相同的公式來計算你做的事情,加上檢查參數是否有意義的開銷。通常,如果庫的算法比你的算法更好,那麼庫只會提高性能,在這種情況下難以實現,因爲......它只是數學。 – SlySherZ 2014-10-22 09:29:43

回答

5

Yeppp!針對100個元素的陣列進行了優化。

由於使用SIMD和函數調用開銷,動態調度和參數檢查的能力有限,它在小型數組(如您的示例中的長度爲3的數組)上效率不高。

+1

謝謝Marat。這也是我的懷疑。所以我想沒有辦法爲單個對象操作進一步優化它... – SunnyDark 2014-10-22 14:40:50