我正在尝试在我的vector类中获取SSE功能(到目前为止我已经重写了三次。:\)并且我正在执行以下操作:

#ifndef _POINT_FINAL_H_
#define _POINT_FINAL_H_

#include "math.h"

namespace Vector3D
{

#define SSE_VERSION 3

#if SSE_VERSION >= 2

    #include <emmintrin.h>  // SSE2

    #if SSE_VERSION >= 3

        #include <pmmintrin.h>  // SSE3

    #endif

#else

#include <stdlib.h>

#endif

#if SSE_VERSION >= 2

    typedef union { __m128 vector; float numbers[4]; } VectorData;
    //typedef union { __m128 vector; struct { float x, y, z, w; }; } VectorData;

#else

    typedef struct { float x, y, z, w; } VectorData;

#endif

class Point3D
{

public:

    Point3D();
    Point3D(float a_X, float a_Y, float a_Z);
    Point3D(VectorData* a_Data);
    ~Point3D();

    // a lot of not-so-interesting functions

private:

    VectorData* _NewData();

}; // class Point3D

}; // namespace Vector3D

#endif

有效!欢呼!但它比我以前的尝试慢。嘘声。

我已经确定我的瓶颈是我用来获取指向结构的指针的malloc。

VectorData* Point3D::_NewData() 
{ 

#if SSE_VERSION >= 2

    return ((VectorData*) _aligned_malloc(sizeof(VectorData), 16)); 

#else

    return ((VectorData*) malloc(sizeof(VectorData))); 

#endif

}

在类中使用SSE的一个主要问题是它必须在内存中对齐才能工作,这意味着重载new和delete操作符,从而产生如下代码:

 BadVector* test1 = new BadVector(1, 2, 3);
 BadVector* test2 = new BadVector(4, 5, 6);
 *test1 *= test2;

你不能再使用默认的构造函数了,你必须避免像瘟疫那样的 new

我的新方法基本上是从类中获取外部数据,因此不必对齐类。

我的问题是:有没有更好的方法来获取指向结构的(对齐的内存)实例的指针,或者我的方法真的很愚蠢而且有更清洁的方式?

有帮助吗?

解决方案

怎么样:

__declspec( align( 16 ) ) VectorData vd;

您还可以按如下方式创建自己的operator new版本

void* operator new( size_t size, size_t alignment )
{
     return __aligned_malloc( size, alignment );
}

然后可以进行分配

AlignedData* pData = new( 16 ) AlignedData;

以16字节边界对齐。

如果没有帮助那么我可能会误解你的要求......

其他提示

您可能不希望一次性矢量的性能得到改善。当您可以将并行处理与某个卷组合时,即按顺序处理多个向量时,并行处理会发出最亮的光。

我修好了。 :o

这真的很容易。我所要做的就是转

VectorData* m_Point;

VectorData m_Point;

我的问题消失了,不需要malloc或对齐。

但我感谢大家的帮助! :d

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top