Frage

Ich versuche, SSE-Funktionalität in meiner Vektor-Klasse zu bekommen (ich habe umgeschrieben es dreimal so weit. \) Und ich tue das folgende:

#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

Es funktioniert! Hurra! Aber es ist langsamer als mein vorheriger Versuch. Boo.

Ich habe festgestellt, dass mein Flaschenhals ist die malloc Ich verwende einen Zeiger auf eine Struktur zu erhalten.

VectorData* Point3D::_NewData() 
{ 

#if SSE_VERSION >= 2

    return ((VectorData*) _aligned_malloc(sizeof(VectorData), 16)); 

#else

    return ((VectorData*) malloc(sizeof(VectorData))); 

#endif

}

Eines der Hauptprobleme bei der Verwendung von SSE in einer Klasse ist, dass es im Speicher ausgerichtet werden muss, für sie zu arbeiten, was bedeutet, dass die neuen und löschen Operatoren Überlastung, was zu Code wie folgt:

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

Sie können nicht mehr den Standard-Konstruktor verwenden, und Sie haben new wie die Pest zu vermeiden.

Mein neuer Ansatz ist im Grunde die Daten aus der Klasse extern haben, so dass die Klasse nicht ausgerichtet werden muss.

Meine Frage ist: Gibt es einen besseren Weg, um einen Zeiger auf eine (ausgerichtet auf Speicher) Instanz einer Struktur oder ist mein Ansatz wirklich dumm und es gibt einen viel sauberen Weg

zu bekommen
War es hilfreich?

Lösung

Wie wäre:

__declspec( align( 16 ) ) VectorData vd;

Sie können auch Ihre eigene Version des Bedieners neu wie folgt erstellen

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

die dann machen allocationas folgt

AlignedData* pData = new( 16 ) AlignedData;

bei einer 16-Byte-Grenze auszurichten.

Wenn das ist keine Hilfe dann kann ich Missverständnis, was Sie fordern für ...

Andere Tipps

Sie sollten wahrscheinlich nicht erwarten, dass eine verbesserte Leistung für Einweg- Vektoren zu erhalten. Die Parallelverarbeitung leuchtet am hellsten, wenn Sie die parallele Verarbeitung mit einigen Volumen kombinieren können, das heißt bei der Verarbeitung von viele Vektoren in Folge.

Ich reparierte es. : O

Es war wirklich ziemlich einfach. Alles, was ich war drehen zu tun hatte

VectorData* m_Point;

in

VectorData m_Point;

und meine Probleme sind weg, ohne die Notwendigkeit für malloc oder Ausrichtung.

Aber ich schätze die Hilfe aller! : D

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top