1

ベクトルクラスでSSE機能を取得しようとしています(これまでに3回書き直しました。:\)。次のようにしています。

#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を使用する際の主な問題の1つは、SSEを機能させるためにメモリ内で整列させる必要があることです。つまり、new演算子とdelete演算子がオーバーロードされ、次のようなコードになります。

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

デフォルトのコンストラクターを使用できなくなりnew、疫病のように回避する必要があります。

私の新しいアプローチは、基本的に、クラスの外部にデータを配置して、クラスを整列させる必要がないようにすることです。

私の質問は、構造体の(メモリに整列された)インスタンスへのポインタを取得するためのより良い方法がありますか、それとも私のアプローチは本当にばかげていて、はるかにクリーンな方法がありますか?

4

3 に答える 3

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 バイト境界で整列します。

それが助けにならない場合は、あなたが求めていることを誤解している可能性があります...

于 2009-09-11T14:38:37.377 に答える
1

使い捨てベクターのパフォーマンスが向上することは期待できません。並列処理は、並列処理をある程度組み合わせることができる場合、つまり多くのベクトルを順番に処理する場合に最も輝きます。

于 2009-09-11T14:40:51.947 に答える
0

それを私が直した。:O

それは本当にかなり簡単でした。私がしなければならなかったのは回すことだけでした

VectorData* m_Point;

の中へ

VectorData m_Point;

そして私の問題はなくなりました.mallocや整列の必要はありません.

しかし、みんなの助けに感謝します!:D

于 2009-09-11T15:33:38.963 に答える