Заслуженный участник |
|
12/07/07 4522
|
Последний раз редактировалось GAA 07.05.2024, 20:22, всего редактировалось 6 раз(а).
Запустив gcc 13.2.0
#include <xmmintrin.h>
#include <stdio.h>
__m128 x, y;
float* p = (float*) &x;
int main(void)
{
p[0] = 0; p[1] = 1; p[2]=2; p[3] =3;
y = x;
y =_mm_shuffle_ps(y, y, 0b01001110);
x = _mm_max_ps(x, y);
printf("%f, %f, %f, %f\n", p[0], p[1], p[2], p[3]);
y = x;
y =_mm_shuffle_ps(y, y, 0b10110001);
x = _mm_max_ps(x, y);
printf("%f, %f, %f, %f\n", p[0], p[1], p[2], p[3]);
printf("----------\n");
p[0] = 3; p[1] = 0; p[2]=1; p[3] =2;
y = x;
y =_mm_shuffle_ps(y, y, 0b01001110);
x = _mm_max_ps(x, y);
printf("%f, %f, %f, %f\n", p[0], p[1], p[2], p[3]);
y = x;
y =_mm_shuffle_ps(y, y, 0b10110001);
x = _mm_max_ps(x, y);
printf("%f, %f, %f, %f\n", p[0], p[1], p[2], p[3]);
printf("----------\n");
p[0] = 2; p[1] = 3; p[2]=0; p[3] =1;
y = x;
y =_mm_shuffle_ps(y, y, 0b01001110);
x = _mm_max_ps(x, y);
printf("%f, %f, %f, %f\n", p[0], p[1], p[2], p[3]);
y = x;
y =_mm_shuffle_ps(y, y, 0b10110001);
x = _mm_max_ps(x, y);
printf("%f, %f, %f, %f\n", p[0], p[1], p[2], p[3]);
printf("----------\n");
p[0] = 1; p[1] = 2; p[2]=3; p[3] =0;
y = x;
y =_mm_shuffle_ps(y, y, 0b01001110);
x = _mm_max_ps(x, y);
printf("%f, %f, %f, %f\n", p[0], p[1], p[2], p[3]);
y = x;
y =_mm_shuffle_ps(y, y, 0b10110001);
x = _mm_max_ps(x, y);
printf("%f, %f, %f, %f\n", p[0], p[1], p[2], p[3]);
printf("----------\n");
return 0;
}
Получим Код: 2.000000, 3.000000, 2.000000, 3.000000 3.000000, 3.000000, 3.000000, 3.000000 ---------- 3.000000, 2.000000, 3.000000, 2.000000 3.000000, 3.000000, 3.000000, 3.000000 ---------- 2.000000, 3.000000, 2.000000, 3.000000 3.000000, 3.000000, 3.000000, 3.000000 ---------- 3.000000, 2.000000, 3.000000, 2.000000 3.000000, 3.000000, 3.000000, 3.000000 ---------- -- Tue 07.05.2024 19:09:36 --Missir, Ваш вариант также работает
#include <xmmintrin.h>
#include <stdio.h>
__m128 x, y;
float* p = (float*) &x;
int main(void)
{
p[0] = 1; p[1] = 2; p[2]=3; p[3] =0;
y =_mm_shuffle_ps(x, x, 0b01001110);
printf("%f, %f, %f, %f\n", p[0], p[1], p[2], p[3]);
x = _mm_max_ps(x, y);
printf("%f, %f, %f, %f\n", p[0], p[1], p[2], p[3]);
y =_mm_shuffle_ps(x, x, 0b10110001);
x = _mm_max_ps(x, y);
printf("%f, %f, %f, %f\n", p[0], p[1], p[2], p[3]);
printf("----------\n");
return 0;
}
Результат: Код: 1.000000, 2.000000, 3.000000, 0.000000 3.000000, 2.000000, 3.000000, 2.000000 3.000000, 3.000000, 3.000000, 3.000000 ---------- Поэтому хотелось бы увидеть для каких данных работает неправильно. -- Tue 07.05.2024 19:18:53 --В целом, использование intrinsic создаёт иллюзию написания на языке высокого уровня, но, лично мне это не нравится. Работая непосредственно с инструкциями и регистрами, можно минимизировать, например пересылки данных или сохранение в памяти (переменных/стеке) промежуточных результатов. Я стараюсь так оформлять последовательность инструкций, чтобы по завершению вычислений результат (результаты) уже лежали в тех регистрах (регистре), в которых (в котором) функция должна возвращать (в соответствии с принятыми соглашениями в используемом компиляторе).
|
|