Я использую GNU C Vector Extensions, а не Intel _mm_*
intrinsics.
Я хочу сделать то же самое, что и Intel _m256_loadu_pd
intrinsic. Присвоение значений один за другим происходит медленно: gcc создает код, который имеет 4 команды загрузки, а не один vmovupd
(который _m256_loadu_pd
создает).
typedef double vector __attribute__((vector_size(4 * sizeof(double))));
int main(int argc, char **argv) {
double a[4] = {1.0, 2.0, 3.0, 4.0};
vector v;
/* I currently do this */
v[0] = a[0];
v[1] = a[1];
v[2] = a[2];
v[3] = a[3];
}
Мне нужно что-то вроде этого:
v = (vector)(a);
или
v = *((vector*)(a));
но не работают. Первый сбой "не может преобразовать значение в вектор", а второй - в segfaults.