c++ - 与 Yeppp 一起表演!比 native 实现慢

标签 c++ performance math vector yeppp

您好,我正在尝试使用 Yeppp 提高我代码中 vector 代数的性能!库但是性能实际上越来越差...... 下面是一段 Vector 类代码:

#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++ 编译器。 编译器选项:g++ -Wall -fexceptions -fPIC -Wl,--no-as-needed -std=c++11 -pthread -ggdb 链接器选项:g++ -shared -lpthread -lyeppp -ldl

那么知道我做错了什么吗?

最佳答案

是啊!针对处理 100 多个元素的数组进行了优化。

由于使用 SIMD 的能力有限以及函数调用、动态调度和参数检查的开销,它在小型数组(如您示例中的长度为 3 的数组)上效率不高。

关于c++ - 与 Yeppp 一起表演!比 native 实现慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26504111/

相关文章:

javascript - 根据另一个数字的百分比从范围中选择一个数字

java - 游戏速度问题

android - 重组何时发生?改变状态或改变输入

python - Sympy nsolve 函数和多个解决方案

c++ - 结构继承 : implicitly public or private?

performance - 简单的代码加速

math - 结点和拟合点有什么区别?

c++ - 在 C++ 中删除动态字符**

c# - C++/C# PInvoke - 编码明确大小的数字

c++ - 如何使用内在函数将两个 char 数组按元素相乘并将乘法相加为 int?