سؤال

أنا أحاول الحصول على 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 );
}

والتي يمكن بعد ذلك جعل allocationas التالي

AlignedData* pData = new( 16 ) AlignedData;

ولمحاذاة في حدود 16 بايت.

إذا أن يكون أي مساعدة بعد ذلك قد يكون سوء فهم ما تسألون عن ...

نصائح أخرى

وربما لا يجب أن تتوقع الحصول على أداء أفضل لناقلات تستخدم مرة واحدة. المعالجة المتوازية يضيء ألمع عندما يمكنك الجمع بين المعالجة المتوازية مع بعض وحدات التخزين، أي عند معالجة <م> كثير ناقلات في التسلسل.

أنا ثابت عليه.:O

وليس من السهل.كل ما كان علي القيام به هو تشغيل

VectorData* m_Point;

في

VectorData m_Point;

و المشاكل قد ولت ، مع حاجة malloc أو محاذاة.

ولكن أنا أقدر مساعدة الجميع!:D

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top