2013-07-22 3 views
3

я использую шаблон специализации способ переключения с плавающей точкой/двойной SSE-: встроенные функциипереключатель SSE с помощью шаблонов встроенных функций

template<typename Precision> 
struct simd 
{ 
    typedef Precision simd_vector; 
}; 

template<> 
struct simd<float> 
{ 
    typedef __m128 simd_vector; 
}; 

template<> 
struct simd<double> 
{ 
    typedef __m128d simd_vector; 
}; 

int main() 
{ 
    simd<float>::simd_vector float_vector;//__m128 
    simd<double>::simd_vector double_vector;//__m128d 
} 

Он хорошо работает, но я не могу понять, как использовать SSE-Intrinsics функции таким же образом, ? Предположим, что мы хотим добавить операцию добавления: _mm_add_ps intrinsic - для float и _mm_add_pd для double. Как я могу использовать трюк специализации шаблона?

+0

Это 'Точность', а не' Presision'! :) –

+0

oops))) исправлено)) – gorill

ответ

4

Так как вы, вероятно, необходимо производить линию для каждой операции, которую вы можете себе представить, вы точно так же можете реализовывать соответствующие операторы:

template<> 
struct simd<double> 
{ 
    typedef __m128d simd_vector; 
}; 

simd<float>::simd_vector operator+(simd<float>::simd_vector a, simd<float>::simd_vector b) 
{ 
    return _mm_add_ps(a, b); 
} 

т.д.

1

Что вы можете сделать, это специализируются каждый класс с соответствующими функциями, которые вызывают их соответствующие функции.

template<> 
struct simd<float> 
{ 
    typedef __m128 simd_vector; 
    simd_vector v; 

    simd operator+(const simd& _s){ 
     //call my simd function for floats to operator on v 
    } 
}; 

template<> 
struct simd<double> 
{ 
    typedef __m128d simd_vector; 
    simd_vector v; 

    simd operator+(const simd& _s){ 
     //call my simd function for doubles to operate on v 
    } 
}; 

И как использовать это будет:

simd<float> sf1, sf2; 
simd<float> sf3 = sf1+sf2; 
//get vector throw sd3.v; 
simd<double> sd1, sd2; 
simd<double> sd3 = sd1 + sd2; 
//get vector through sd3.v; 

Конечно, вы должны соответствующим образом инициализировать SF1, SF2, SD1, SD2.

+0

Не могли бы вы показать пример использования предложенного метода? – gorill

+1

Я добавил пример использования. – pippin1289

Смежные вопросы