| 
													Последний раз редактировалось 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-- Tue 07.05.2024 19:09:36 --Missir3.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
 ----------
 , Ваш вариант также работает 
#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.0000003.000000, 2.000000, 3.000000, 2.000000
 3.000000, 3.000000, 3.000000, 3.000000
 ----------
 Поэтому хотелось бы увидеть для каких данных работает неправильно.-- Tue 07.05.2024 19:18:53 -- В целом, использование intrinsic создаёт иллюзию написания на языке высокого уровня, но, лично мне это не нравится. Работая непосредственно с инструкциями и регистрами, можно минимизировать, например пересылки данных или сохранение в памяти (переменных/стеке) промежуточных результатов. Я стараюсь так оформлять последовательность инструкций, чтобы по завершению вычислений результат (результаты) уже лежали в тех регистрах (регистре), в которых (в котором) функция должна возвращать (в соответствии с принятыми соглашениями в используемом компиляторе).
 |