【问题标题】:SSE vector Operation on type double双精度型 SSE 向量运算
【发布时间】:2017-10-04 00:42:57
【问题描述】:

我想在 AMD64 架构上使用包含双精度类型值的向量的 SIMD 操作。下面是我的问题的简单示例。如果我打印浮点值,这可以正常工作,但不能用于双精度。我需要最多 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.

}

【问题讨论】:

  • %d 格式说明符用于整数。如果您不想打印浮点数或双精度数,请使用%f
  • 除了明显的错误之外,对于常量值,优化器会仔细检查并将常量传递给printf。这里根本不会进行任何 SIMD 操作。

标签: c++ c sse simd


【解决方案1】:

你有一些错误:

  1. 在函数 printf 中使用 %d 格式说明符而不是 %f。
  2. 要有效地使用 SIMD 指令,您必须使用向量指令(例如 _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

【讨论】:

  • 最好你解释错误是什么!
【解决方案2】:

在 printf 中,您使用了格式说明符作为 %d,您需要使用 %f 来打印双精度值

【讨论】:

    猜你喜欢
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    相关资源
    最近更新 更多