SSE1 Использование divps intrinsic xmmintrin.h для разделения четырех 32-битных чисел и использование printf?

Мне нужна помощь, разделив четыре числа в качестве примера и напечатав их. Я использую G ++ в качестве моего компилятора. Следующий код компилируется с -msse3 -mmmx флаги, я даже не уверен, что они мне нужны, но это работает. Я знаю, что должен задавать числа с вызовом функции перед делением, но я не уверен, какую функцию вызывать (я думаю, что ссылка имеет установленные функции только для int). Если есть способ напечатать результат, используя std::cout это было бы лучше, но printf отлично работает для этого (я не уверен, если print128_num правильно для этого случая, было написано для int первоначально). Вот код.

#include <emmintrin.h>
#include <xmmintrin.h>
#include <stdio.h>
#include <stdint.h>

void print128_num(__m128i var)
{
uint16_t *val = (uint16_t*) &var;
printf("Numerical: %i %i %i %i %i %i %i %i \n",
val[0], val[1], val[2], val[3], val[4], val[5],
val[6], val[7]);
}
__m128 divide_4_32_bit_values(__m128 __A, __m128 __B)
{
return _mm_div_ps (__A, __B);
}
int main(void)
{return 0;
}

1

Решение

Я исправил несколько проблем, и я думаю, что теперь это делает то, что вы хотите:

#include <xmmintrin.h>
#include <stdio.h>

void print128_num(const char * label, __m128 var)
{
float *val = (float *) &var;
printf("%s: %f %f %f %f\n",
label, val[0], val[1], val[2], val[3]);
}

__m128 divide_4_32_bit_values(__m128 __A, __m128 __B)
{
return _mm_div_ps (__A, __B);
}

int main(void)
{
__m128 v1 = _mm_set_ps(4.0f, 3.0f, 2.0f, 1.0f);
__m128 v2 = _mm_set_ps(1.0f, 2.0f, 3.0f, 4.0f);
__m128 v = divide_4_32_bit_values(v1, v2);

print128_num("v1", v1);
print128_num("v2", v2);
print128_num("v ", v);

return 0;
}

Тестовое задание:

$ gcc -Wall -msse3 m128_print.c
$ ./a.out
v1: 1.000000 2.000000 3.000000 4.000000
v2: 4.000000 3.000000 2.000000 1.000000
v : 0.250000 0.666667 1.500000 4.000000
$
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]