2016-10-02 6 views
-3
void sse_mul_float(float* a, float* b, int N)                                           
{                                                     
    int nb_iters = N/4;                                               

    __m128* l = (__m128*)a;                                              
    __m128* r = (__m128*)b;                                              

    for (int i = 0; i < nb_iters; ++i, ++l, ++r)                                         
    _mm_store_ps(l, _mm_mul_ps (l, r)); 
} 

Я хотел бы умножать элементы одного массива поплавка с другим, и я хотел бы сохранить результаты в первом массивеКак объединить два массива с плавающей точкой, используя sse?

Я получаю эту ошибку: не может преобразовать «__m128 * {ака __vector (4) с плавающей точкой *}»на '__m128 {ака __vector (4) флоат}' для аргумента '1' до '__m128 _mm_mul_ps (__ M128, __m128)'

+0

я могу преобразовать' поплавка * 'к' float', добавив '*' перед именем. Используйте '* l' и' * r'. –

+0

также: 'N/4' на самом деле не очень приятный, используйте' N/sizeof (float) ' –

+0

Вы имеете в виду следующее: _mm_store_ps (l, _mm_mul_ps (* l, * r)); ? –

ответ

0
void sse_mul_float(float* a, float* b, int N)                                           
{   
    int nb_iters = N/sizeof(float);                                               

    float c; 
    __m128* l = (__m128*)a;                                              
    __m128* r = (__m128*)b; 


    for (int i = 0; i < nb_iters; ++i, ++l, ++r) 
    { 
     _mm_store_ps(&a[i*4], _mm_mul_ps(*l, *r)); 
    } 

} 
+1

'sizeof (float)' очень вводит в заблуждение. Вам нужно разделить число поплавков внутри '__m128', которое просто случайно равно 4. – chtz