Вот хочу впилить поддержку вычислений упакованных чиселок с SSE в свою вокселе-библиотеку и посмотреть, будет ли профит.
У меня gcc4.9
Пишу такой код:
#include <xmmintrin.h>
...
typedef union
{
float c[4];
__v4sf vect;
} dot __attribute__ ((aligned (16)));
...
void calc_bounding_box (const dot *set, unsigned int n, dot *min, dot *max)
{
int i;
min->vect = set[0].vect;
max->vect = set[0].vect;
for (i=1; i<n; i++)
{
min->vect = __buildin_ia32_minps (min->vect, set[i].vect);
max->vect = __buildin_ia32_maxps (max->vect, set[i].vect);
}
}
А при компиляции рядом с min(/max)->vect = : error: incompatible types when assigning to type '__v4sf' from type 'int'.
Вот и не могу понять, откуда там int?
Из xmmintrin.h:
typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__));
...
extern __inline __m128 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_mm_min_ps (__m128 __A, __m128 __B)
{
return (__m128) __builtin_ia32_minps ((__v4sf)__A, (__v4sf)__B);
}
extern __inline __m128 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_mm_max_ps (__m128 __A, __m128 __B)
{
return (__m128) __builtin_ia32_maxps ((__v4sf)__A, (__v4sf)__B);
}
Вроде этот __m128 вполне можно прировнять __v4sf, так почему же не работает? На всякий случай, вся «программа»: