2009-09-11 63 views
1

我想在我的矢量类来获得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的主要问题之一是,它在存储器中对准为它工作,这意味着过载的新和删除操作符,从而导致这样的代码:

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

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

我的新方法基本上是从类的外部数据,所以类不必对齐。

我的问题是:有没有更好的方法来获得指向结构(对齐内存)实例的指针,还是我的方法真的很笨,还有更简洁的方法?

回答

2

如何:

__declspec(align(16)) VectorData vd; 

您也可以创建自己的运营商新的版本如下

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

那么它可以使allocationas如下

AlignedData* pData = new(16) AlignedData; 

在16字节边界对齐。

如果那是没有任何帮助的话,我可能会误会你问什么...

+1

你的意思是_declspec,我想? – cedrou 2009-09-11 14:50:13

+0

LOL真的没有注意到这个错字! – Goz 2009-09-11 15:30:18

1

你可能不应该期望获得的一次性使用的载体提高了性能。当您可以将并行处理与某些音量相结合时,即按顺序处理多个向量时,并行处理将发光最亮。

0

我修好了。 :O

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

VectorData* m_Point; 

VectorData m_Point; 

,我的问题都没有了,没有必要的malloc或对齐。

但我很感谢大家的帮助! :D

+0

对不起,但我怀疑。是的,x86-64上的MS编译器在16字节边界上对齐(不适用于32位平台)。我怀疑ICC是否会在堆栈中对齐16个字节,如果没有明确地这样说,也正是因为它试图产生真正快速的代码。 declspec将是必要的,resp。相应的gcc选项。 – gimpf 2009-09-11 15:41:47

+0

而且,是的,malloc()首先是个坏主意...... – gimpf 2009-09-11 15:42:27

相关问题