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

Posted

技术标签:

【中文标题】SSE1 使用 divps 内在 xmmintrin.h 来划分四个 32 位浮点数并使用 printf?【英文标题】:SSE1 Using divps intrinsic xmmintrin.h to divide four 32-bit floats and using printf? 【发布时间】:2013-07-03 00:53:03 【问题描述】:

我需要帮助例如将四个数字除以并打印它们。我使用 g++ 作为我的编译器。以下代码确实使用 -msse3 -mmmx 标志编译,我什至不确定我是否需要这些,但它可以工作。我知道在除法之前我必须用函数调用set 数字,但我不确定要调用哪个函数(我认为链接只有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;

【问题讨论】:

您是否有意将 4 floats 打印为 8 int16s? 不,我不是我在帖子末尾写的那可能是错误的。所以我需要修复 4 个浮点数? 等等,所以你问的是如何将printf() 改为打印 4 floats 而不是你所拥有的? 是的,还有在调用divide_4_32_bit_values之前如何使用正确的set函数。 这段代码真的是 wtf。 【参考方案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
$ 

【讨论】:

我是否总是在_mm_set 之后放置_ps 以获得正确的设置函数以使用沿_mm_div_ps 行的函数,假设两个操作的值的数量都正确放置? 是的,_ps 后缀存在于所有单精度(浮点)内在函数上——它代表“(p)acked (s) 单精度”。

以上是关于SSE1 使用 divps 内在 xmmintrin.h 来划分四个 32 位浮点数并使用 printf?的主要内容,如果未能解决你的问题,请参考以下文章

jquery 选择器混淆 - $('div p') vs $('div>p')

SSE 内在函数向右移位

使用内在函数提高数组仿射变换的速度

用 sse 执行内在函数

对类使用 C 内在函数和内存对齐困难

如何使用内在函数对 double 执行绝对值? [复制]