c++ - SSE1 使用 divps intrinsic xmmintrin.h 划分四个 32 位 float 并使用 printf?

标签 c++ g++ sse intrinsics

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

最佳答案

我已经解决了一些问题,我认为这现在可以满足您的需求:

#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
$ 

关于c++ - SSE1 使用 divps intrinsic xmmintrin.h 划分四个 32 位 float 并使用 printf?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17438090/

相关文章:

c++ - 编译器对 new 返回值的行为

c++ - 使用 C++/boost::asio/libcurl 的简单代理 - 无法下载图像

c++ - 为什么 gcc 4.9 (trunk) 这么慢?

c++ - 堆栈链接错误问题

c++ - 可变参数模板是否可以与当前的编译器一起正常工作?

excel - dylib 动态库调用 dylib : Undefined symbols for architecture i386

c - 计算大型 CRC32 的正确方法是什么

c++ - 在真实 3D 环境(例如建筑物)中寻路

c - 矩阵乘法的自动向量化

c - 如何将相同的值写入 x86 中的连续位置