SSE1使用divps内在xmmintrin.h划分四个32位浮点,并使用printf

SSE1 Using divps intrinsic xmmintrin.h to divide four 32-bit floats and using printf?

本文关键字:32位 四个 printf 内在 divps 使用 xmmintrin 划分 SSE1      更新时间:2023-10-16

作为一个例子,我需要帮助划分四个数字并打印它们。我使用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;
}

我已经修复了一些问题,我认为现在可以满足您的要求:

#include <xmmintrin.h>
#include <stdio.h>
void print128_num(const char * label, __m128 var)
{
    float *val = (float *) &var;
    printf("%s: %f %f %f %fn",
       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
$