我正在尝试在我的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
。
我的新方法基本上是从类中获取外部数据,因此不必对齐类。
我的问题是:有没有更好的方法来获取指向结构的(对齐的内存)实例的指针,或者我的方法真的很愚蠢而且有更清洁的方式?
答案 0 :(得分:2)
怎么样:
__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字节边界对齐。
如果没有帮助那么我可能会误解你的要求......
答案 1 :(得分:1)
您可能不希望一次性矢量的性能得到改善。当您可以将并行处理与某个卷组合时,即按顺序处理多个向量时,并行处理会发出最亮的光。
答案 2 :(得分:0)
我修好了。 :o
这真的很容易。我所要做的就是转
VectorData* m_Point;
到
VectorData m_Point;
我的问题消失了,不需要malloc或对齐。
但我感谢大家的帮助! :d