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;
【问题讨论】:
您是否有意将 4float
s 打印为 8 int16
s?
不,我不是我在帖子末尾写的那可能是错误的。所以我需要修复 4 个浮点数?
等等,所以你问的是如何将printf()
改为打印 4 float
s 而不是你所拥有的?
是的,还有在调用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?的主要内容,如果未能解决你的问题,请参考以下文章