문제

벡터 클래스에서 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 전염병처럼.

내 새로운 접근법은 기본적으로 클래스의 외부 데이터를 클래스의 외부에 두는 것이므로 클래스를 정렬 할 필요가 없습니다.

내 질문은 : 구조물의 (메모리에 정렬 된) 인스턴스에 대한 포인터를 얻는 더 좋은 방법이 있습니까?

도움이 되었습니까?

해결책

어때요 :

__declspec( align( 16 ) ) VectorData vd;

?

다음과 같이 나만의 운영자 버전을 만들 수도 있습니다.

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

그런 다음 할당을 따를 수 있습니다

AlignedData* pData = new( 16 ) AlignedData;

16 바이트 경계에서 정렬합니다.

그것이 도움이되지 않으면 당신이 요구하는 것을 오해 할 수 있습니다 ...

다른 팁

일회용 벡터에 대한 성능이 향상 될 것으로 예상해서는 안됩니다. 병렬 처리와 병렬 처리를 일부 볼륨과 결합 할 수있을 때 가장 밝게 빛납니다. 많은 순서대로 벡터.

나는 그것을 고쳤다. :영형

정말 쉬웠습니다. 내가해야 할 일은 바뀌는 것뿐이었습니다

VectorData* m_Point;

~ 안으로

VectorData m_Point;

그리고 Malloc이나 정렬이 필요하지 않고 내 문제가 사라졌습니다.

하지만 모두의 도움에 감사드립니다! :디

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top