クラスのインスタンスに構造体へのポインタを与える
-
05-07-2019 - |
質問
ベクタークラスで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