gpt4 book ai didi

c++ - double 型上的 SSE vector 运算

转载 作者:行者123 更新时间:2023-11-30 20:21:06 24 4
gpt4 key购买 nike

我想在 AMD64 架构上使用包含 double 类型值的 vector 的 SIMD 操作。下面是我的问题的简单示例。如果我打印浮点值,则效果很好,但对于 double 值则不然。我需要最多 9 位小数的精度。

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

typedef union f4vector
{
__m128d v;
}float4;

int main()
{
float4 x,y,z;
double f0[2]={2334, 5};
double f1[2]={2334.32345324 , 5};
double f3[2];

x.v=_mm_set_pd(f0[0], f0[1]);
y.v = _mm_set_pd(f1[0], f1[1]);
z.v = _mm_mul_pd(x.v , y.v);

f3[0]=z.v[0];
f3[1]=z.v[1];

printf("%d, %d\n", f3[0], f3[1]); // doesnt print correct values.

}

最佳答案

你有一些错误:

  1. 在函数 printf 中使用 %d 格式说明符代替 %f。
  2. 要有效地使用 SIMD 指令,您必须使用 vector 指令(例如 _mm_loadu_pd/_mm_storeu_pd)来加载和存储数据。内在的 _mm_set_pd 效率非常低。

下面我写了正确的例子:

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

int main()
{
double d0[2] = { 2334, 5 };
double d1[2] = { 2334.32345324 , 5 };
double d2[2] = { 0, 0 };

__m128d v0 = _mm_loadu_pd(d0);
__m128d v1 = _mm_loadu_pd(d1);
__m128d v2 = _mm_mul_pd(v0, v1);
_mm_storeu_pd(d2, v2);

printf("%f, %f\n", d2[0], d2[1]);
}

输出:

5448310.939862, 25.000000

关于c++ - double 型上的 SSE vector 运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43806543/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com