質問

ベクタークラスで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 を避ける必要があります。

私の新しいアプローチは、基本的にクラスの外部にデータを持たせることで、クラスを整列させる必要はありません。

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

役に立ちましたか?

解決

方法:

__declspec( align( 16 ) ) VectorData vd;

次のように独自のバージョンの演算子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;

into

VectorData m_Point;

そしてmallocやaligningを必要とせずに私の問題はなくなりました。

しかし、皆さんの助けに感謝します! :D

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top